我有一个非常大的形式,有两种可能性。它是事件的表单,可以从组合框(ModelChoice查询)中选择事件位置。但是,用户可以选中“新位置”复选框,然后表单显示插入新位置所需的字段,并重置“现有位置”组合框。现在,这一切都非常适合javascript(jQuery),但我的问题是如何验证表单中未使用的字段。
简单地说>我有7个表格文件,其中3个总是强制性的(事件类型,日期时间等),而另一个取决于复选框“新位置”的状态:如果检查了new_location>验证位置等字段,忽略其余字段(允许它们为空),否则忽略位置字段并验证其余字段。
class EventForm(ModelForm):
area = forms.ModelChoiceField(
queryset=Area.objects.order_by('name').all(),
empty_label=u"Please pick an area",
label=u'Area',
error_messages={'required':u'The area is mandatory!'})
type = forms.ModelChoiceField(
queryset=SportType.objects.all(),
empty_label=None,
error_messages={'required':'Please pick a sport type!'},
label=u"Sport")
#shown only if new_location is unchecked - jQuery
location = forms.ModelChoiceField(
queryset=Location.objects.order_by('area').all(),
empty_label=u"Pick a location",
error_messages={'required':'Please pick a location'},
label=u'Location')
#trigger jQuery - hide/show new location field
new_location = forms.BooleanField(
required=False,
label = u'Insert new location?'
)
address = forms.CharField(
label=u'Locatio address',
widget=forms.TextInput(attrs={'size':'30'}),
error_messages={'required': 'The address is required'})
location_description = forms.CharField(
label=u'Brief location description',
widget=forms.Textarea(attrs={'size':'10'}),
error_messages={'required': 'Location description is mandatory'})
class Meta:
model = Event
fields = (
'type',
'new_location',
'area',
'location',
'address',
'location_description',
'description',
)
答案 0 :(得分:1)
您可以检查clean
方法中是否存在表单字段。如果存在,请在其上运行自定义验证规则。
def clean(self):
cleaned_data = self.cleaned_data
field_name = cleaned_data.get('FIELD_NAME', None)
if field_name:
... # do stuff
return cleaned_data
答案 1 :(得分:0)
我最终只使用普通表单(不是ModelForm)和clean(self)
自定义验证,具体取决于复选框的状态,我认为这是正确的方法。然后使用self._errors["address"]=ErrorList([u'Some custom error'])
,我能够完全自定义验证过程中可能出现的各种错误。