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")