通过覆盖clean将表单验证添加到Django modelform

时间:2019-03-18 13:37:06

标签: django forms validation django-models django-forms

我有一个较长的模型表单,主要用于模型表单验证,当任何单个字段都失败时,我想在表单顶部显示一个“ 请更正以下错误”错误验证。我尝试通过覆盖modelform上的clean方法来执行此操作,但是此时没有错误。

# models.py
class MyModel(models.Model):
    myfield = models.IntegerField(default=0, validators=[MinValueValidator(0)])

# forms.py
class MyModelForm(forms.ModelForm)
    class Meta:
        models = MyModel
        fields = ['myfield']

    def clean(self):
        cleaned_data = super().clean()
        if any([field.errors for field in self]):
            raise forms.ValidationError("Please correct the errors below.")
        return cleaned_data

当我输入一个无效值(例如-1)时,该字段仍在其下方显示正确的错误消息,但是该表单没有任何错误。

我正在使用{% crispy %}来呈现表单,该表单会自动将表单错误放在顶部,因此这不是模板问题。

问题(来自调试器)是在调用clean()时,form['myfield'].errors为空。

2 个答案:

答案 0 :(得分:2)

这不是您要在表单中执行的操作。您可以在模板中完成此操作:

\Crypt::decrypt(Cookie::get('language'), false)

实际上,这几乎就是the admin change form template的作用。

答案 1 :(得分:0)

如丹尼尔所说,通常您将在模板中检查form.errors而不是在clean方法中引发另一个错误。

如果您确实想使用clean方法执行此操作,请检查self.errors而不是单个字段错误。

def clean(self):
    cleaned_data = super().clean()
    if self.errors:
        raise forms.ValidationError("Please correct the errors below.")
    return cleaned_data