表单级别的 django 模型表单验证

django modelform validation at the form level

我可以为我的 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)

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

是的,正如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__;重写方法只是为了调用超类方法是没有意义的。