2010-02-21 44 views
12

我是Django(和Python)的新手,并试图弄清楚如何对表单验证的某些方面进行条件化。在这种情况下,应用程序有一个HTML接口,用户可以从小部件中选择日期和时间。表单对象上的clean方法获取时间和日期字段的值,并将其重新转换为datetimeDjango表单验证:使“必需”条件?

除了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_datefoo_time需要除非foo_timestamp提供?

回答

21

这是通过表单上的clean方法完成的。不过,您需要将foo_datefoo_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') 
+0

谢谢,我在想'干净'可能是这样做的地方。但是,是否有可能针对'foo_date'和'foo_time'字段验证错误,而不是一般的表单验证错误? 谢谢,克里斯 – ChrisW 2010-02-21 19:49:08

+1

这在第二个例子中解释我链接到 – 2010-02-21 19:59:22

+0

self.RTFM的文档;谢谢,我会深入挖掘。 – ChrisW 2010-02-21 20:12:45

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

它至今完全为我工作。