我是Django(和Python)的新手,我正在试图找出如何条件化表单验证的某些方面。在这种情况下,应用程序有一个HTML界面,用户可以从小部件中选择日期和时间。表单对象上的clean
方法获取时间和日期字段的值,并将它们重新转换为datetime
。
除了HTML界面之外,还有一个iPhone客户端调用应用程序,我想传递一个UNIX时间戳式的时间值。
我的表单代码如下:
class FooForm(forms.ModelForm):
foo_date = forms.CharField(required=True, widget=forms.RadioSelect(choices=DATE_CHOICES))
foo_time = forms.CharField(required=True, widget=SelectTimeWidget())
foo_timestamp = forms.CharField(required=False)
除非提供 foo_date
,否则如何使foo_time
和foo_timestamp
需要?
答案 0 :(得分:22)
这是通过表单上的clean
方法完成的。您需要将foo_date
和foo_time
设置为required=False
,因为clean
仅在每个字段经过验证后调用(另请参阅documentation)。
class FooForm(forms.Form)
# your field definitions
def clean(self):
data = self.cleaned_data
if data.get('foo_timestamp', None) or (data.get('foo_date', None) and data.get('foo_time', None)):
return data
else:
raise forms.ValidationError('Provide either a date and time or a timestamp')
答案 1 :(得分:8)
我发现自己需要一种“标准”方式来执行此操作,因为我的表单有几个有条件的必填字段。所以我使用以下方法创建了一个超类:
def validate_required_field(self, cleaned_data, field_name, message="This field is required"):
if(field_name in cleaned_data and cleaned_data[field_name] is None):
self._errors[field_name] = self.error_class([message])
del cleaned_data[field_name]
然后在我的表格清洁方法中我有:
def clean(self):
cleaned_data = super(FormClass, self).clean()
if(condition):
self.validate_required_field(cleaned_data, 'field_name')
到目前为止,它对我来说非常合适。