表单级别的django模型验证

时间:2017-05-08 15:43:03

标签: django django-forms django-crispy-forms django-validation

我可以为我的django模型设置自定义验证器,我想要做的是在表单层执行验证,其中表单元素彼此具有依赖关系。为了说明,我说有以下模型:

class MyModel(models.Model):
    num_average = models.IntegerField(verbose_name='Number of averages',
                                      default=1)

    num_values = models.IntegerField(verbose_name='Number of values', 
                                     default=3)

依赖是num_values = num_average * 3。我知道我可以自动设置它,但为此我们假设我们想要用户输入。我有一个表格:

class MyForm(ModelForm):
    class Meta:
        model = MyModel
        fields = ['num_average', 'num_values']

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)

有没有办法在提交被触发之前验证整个表单?

1 个答案:

答案 0 :(得分:2)

是的,正如form docs指出的那样,这种事情是用clean方法完成的。

class MyForm(ModelForm):
    class Meta:
        model = MyModel
        fields = ['num_average', 'num_values']

    def clean(self):
        data = self.cleaned_data
        if data['num_values'] != data['num_average'] *3:
            raise forms.ValidationError('values must be three times average')

顺便说一句,如果你不对它做任何事情,你就不应该定义__init__;重写一个方法只是为了调用超类方法是没有意义的。