3

私はDjangoを使用しており、2つの追加のインラインフォームセットを含むフォームがあります。各フォームセットに少なくとも1つの入力済みフォームが含まれていることを検証したいと思います。これが機能するようにコードを記述しましたが、一度に各フォームセットに対してのみ機能します。フォームセットフォームを入力せずにフォームを送信すると、最初のフォームのみが検証エラーを示します。次に、最初のフォームセットフォームにデータを入力し、2番目のフォームを空白のままにすると、2番目のフォームはエラーになります。

両方が有効でない場合、両方のフォームにエラーを表示したい。

フォームは単なる標準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>
4

2 に答える 2

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
于 2011-01-09T01:06:22.983 に答える
0

私は同様の問題を抱えていました.Djangoが追加のフォームフィールドを処理する方法が原因で、追加のフォームが検証されていないという問題がありました. 見てみましょう: Django Formset.is_valid() が余分なフォームで失敗する

于 2011-02-01T22:26:27.193 に答える