Пользовательская проверка встроенного набора форм Django Одновременно проверяет только один набор форм - PullRequest
3 голосов
/ 02 января 2011

Я использую Django и у меня есть форма с двумя дополнительными встроенными наборами форм.Я хочу проверить, что каждый набор форм содержит хотя бы одну заполненную форму.Я написал такой код, чтобы он работал, но он работает только для каждого набора форм одновременно.Если я отправляю форму без заполненных форм, только первая показывает ошибку проверки.Если затем я заполняю первую форму набора форм и оставляю вторую пустую, вторая ошибка.

Я хочу, чтобы ошибки появлялись в обеих формах, если обе они недействительны.просто стандартные 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 ]

2 голосов
/ 09 января 2011

вызовите функцию 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 голосов
/ 02 февраля 2011

У меня была похожая проблема, и проблема заключалась в том, что дополнительные формы не проверялись из-за того, как Django обрабатывает дополнительные поля формы. Посмотрите: Django Formset.is_valid () не работает для дополнительных форм

...