Django表单验证:使"必需"有条件?

Chr*_*isW 13 python django django-forms

我是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)
Run Code Online (Sandbox Code Playgroud)

除非提供foo_date,否则如何制作和foo_time要求? foo_timestamp

Ben*_*end 24

这是通过clean表单上的方法完成的.您需要设置foo_datefoo_timerequired=False,不过,因为clean每个领域已被证实后,才会调用(另见文档).

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')
Run Code Online (Sandbox Code Playgroud)


Ell*_*ott 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]
Run Code Online (Sandbox Code Playgroud)

然后在我的形式干净的方法,我有:

def clean(self):
    cleaned_data = super(FormClass, self).clean()
    if(condition):
        self.validate_required_field(cleaned_data, 'field_name')
Run Code Online (Sandbox Code Playgroud)

到目前为止,它对我来说非常合适.