Django Formsets: Как применить различные проверки для каждой формы в formset?

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

У меня есть LocationForm, где я отображаю 4 текстовых поля, позволяя пользователю ввести до 4 мест:

class LocationForm(forms.Form):
    user_entered_address = forms.CharField(required=False, max_length=255)
    full_address = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput())
    city = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput())
    state = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput())
    country = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput())
    latitude = forms.CharField(required=False, widget=forms.HiddenInput())
    longitude = forms.CharField(required=False, widget=forms.HiddenInput())

LocationFormSet = formset_factory(LocationForm, extra=4, max_num=4)

Это прекрасно работает для отображения полей ввода, но я бы хотел, чтобы первая LocationForm в наборе форм была обязательной, а остальные формы были необязательными (то есть пользователь должен ввести хотя бы 1 место в первой форме, но остальные необязательный).

Если я изменю форму, удалив required=False:

    user_entered_address = forms.CharField(max_length=255)

затем user_entered_address требуется для всех форм. У меня есть чувство, что мне нужно написать собственный метод clean(), но я застрял, как найти первую форму, выяснить, если user_entered_address пусто, и если это так, вызовите ValidationError:

class BaseLocationFormSet(BaseFormSet):
    def clean(self):
        # How to do I find the first form and ensure user_entered_address isn't blank?

LocationFormSet = formset_factory(LocationForm, extra=4, max_num=4, formset=BaseLocationFormSet)

Или это неправильный подход, и есть лучший способ сделать это? Спасибо!

1 ответ

Решение

Вы можете получить доступ к формам, как:

form = self.forms[0]

Так что в вашей чистоте просто проверьте первую форму и игнорируйте другие.

form = self.forms[0]
title = form.cleaned_data['title']
if title is None:
    raise forms.ValidationError("Missing title")
Другие вопросы по тегам