我正在使用Django 1.4 formsets,我想对formset中的第一个表单执行不同的验证。
我有一个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)
这非常适合显示输入字段,但我希望formset中的第一个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)
或者这是错误的方法,还有更好的方法吗?谢谢!
答案 0 :(得分:1)
您可以访问以下表单:
form = self.forms[0]
所以在你干净时只需检查第一个表格并忽略其他表格。
form = self.forms[0]
title = form.cleaned_data['title']
if title is None:
raise forms.ValidationError("Missing title")