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