2011-01-01 9 views
3

私はDjangoを使用していますが、さらに2つのインラインフォームセットを持つフォームを持っています。各フォームセットに少なくとも1つの入力フォームが含まれていることを検証したい。私はこれが動作するようなコードを書いたことがありますが、それは一度に各フォームセットに対してのみ機能します。 formsetフォームを入力せずにフォームを送信すると、最初のフォームセットだけが検証エラーを示します。私は最初のformsetフォームを作成し、2つ目の空白を残すと、2番目のエラーが発生します。Django Inline Formsetカスタム検証は、一度に単一のFormsetのみを検証します

両方が有効でない場合、両方のフォームにエラーが表示されます。

フォームは標準ModelFormのインスタンスです。ここに私の見解です:

class RequiredBaseInlineFormSet(BaseInlineFormSet): 
    def clean(self): 
     self.validate_unique() 
     if any(self.errors): 
      return 
     if not self.forms[0].has_changed(): 
      raise forms.ValidationError("At least one %s is required" % self.model._meta.verbose_name) 

def create(request): 
    profile_form = ProfileForm(request.POST or None) 
    EmailFormSet = inlineformset_factory(Profile, Email, formset=RequiredBaseInlineFormSet, max_num=5, extra=5, can_delete=False) 
    email_formset = EmailFormSet(request.POST or None) 
    PhoneFormSet = inlineformset_factory(Profile, Phone, formset=RequiredBaseInlineFormSet, max_num=5, extra=5, can_delete=False) 
    phone_formset = PhoneFormSet(request.POST or None) 
    if profile_form.is_valid() and email_formset.is_valid() and phone_formset.is_valid(): 
     profile = profile_form.save() 
     emails = email_formset.save(commit=False) 
     for email in emails: 
      email.profile = profile 
      email.save() 
     phones = phone_formset.save(commit=False) 
     for phone in phones: 
      phone.profile = profile 
      phone.save() 
     messages.add_message(request, messages.INFO, 'Profile successfully saved') 
    return render_to_response(
     'add.html', { 
      'profile_form': profile_form, 
      'email_formset': email_formset, 
      'phone_formset': phone_formset 
     }, context_instance = RequestContext(request) 
    ) 

そして、ここで私のテンプレートのフォーム、それは便利だ包みです:あなたは検証が上で発生する各フォームの

<form action="" method="post" accept-charset="utf-8"> 
    {{ email_formset.management_form }} 
    {{ phone_formset.management_form }} 
    {{ profile_form|as_uni_form }} 
    <div class="formset-group" id="email_formset"> 
     {{ email_formset.non_form_errors }} 
     {% for email_form in email_formset.forms %} 
      <div class='form'> 
       {{ email_form|as_uni_form }} 
      </div> 
     {% endfor %} 
    </div> 
    <div class="formset-group" id="phone_formset"> 
     {{ phone_formset.non_form_errors }} 
     {% for phone_form in phone_formset.forms %} 
      <div class='form'> 
       {{ phone_form|as_uni_form }} 
      </div> 
     {% endfor %} 
    </div> 
    <input type="submit" value="Save Profile" id="submit"> 
</form> 

答えて

2

コールIS_VALID()関数が。あなたの例では、a.is_validとb.is_valid anc c.is_valid ... aがfalseの場合、bとcは決して呼び出されません。別の何かを試してみてください、のように:

alpha=a.is_valid() 
beta=b.is_valid() 
gamma=c.is_valid() 

if alpha and beta and gamma: 
    do stuff 
+0

私はあなたが正しいと思います。私はこれを残しましたが、今戻っています。すべての書式セットをリストに入れ、 'all() 'で検証することで成功しました。 'もし、form_form.is_valid()とall(formsetsのfsのための[fs.is_valid()]):'入力をありがとう。 –

0

私は同様の問題を持っていた問題は、余分なフォームが原因Djangoは、余分なフォームフィールドを処理する方法に検証されていなかったということでした。見てください:Django Formset.is_valid() failing for extra forms

関連する問題