【问题标题】:Adding form validation to django modelform by overriding clean通过覆盖 clean 将表单验证添加到 django modelform
【发布时间】:2019-08-08 21:33:50
【问题描述】:

我有一个很长的模型表单,主要是模型表单验证,我想在表单顶部出现“请更正以下错误”错误,当任何单个字段失败时验证。我试图通过覆盖模型表单上的 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 为空。

【问题讨论】:

  • 这类似于this question,但我已经调用了super,所以这个解决方案似乎不起作用。

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


【解决方案1】:

这不是你会在表单中做的事情。您可以在模板中执行此操作:

{% if form.errors %}
    Please correct the errors below.
    ... now list the errors ...
{% endif %}

事实上,the admin change form template 几乎就是这样做的。

【讨论】:

  • 我也试过这个,但没有用。我的模板目前是:{% load crispy_forms_tags %} {% load crispy_forms_filters %} {% if form.has_errors %} <div class="alert alert-danger" role="alert"> Please correct the errors below. </div> {% endif %} {% crispy form %} 然而,即使有几个错误,这也不会出现在 HTML 中,因为我的 form.errors 是空的,尽管某些字段有错误(字段错误本身仍然显示在相应的字段下)。
  • 你为什么使用has_errors?该属性只是errors
  • 啊,我明白了,出于某种原因,我认为has_errors 只是一个检查form.errors 长度的布尔函数,因此效率更高,但我一定一直在寻找在旧代码。将其更改为 form.errors 已解决问题,谢谢!
【解决方案2】:

正如 Daniel 所说,您通常会在模板中检查 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

【讨论】:

  • 这是我的第一次尝试,我只将它修改为我提供的代码,因为在调用 clean() 时,没有列出任何错误,只是在 post_clean 方法中出现错误计算出来的。
  • 是的,[full_clean] 方法在clean() 之前调用clean(),所以如果你真的想在表单中添加另一个错误,你必须重写一个不同的方法,例如full_cleanis_valid.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2021-10-28
  • 2021-09-23
  • 2015-06-25
  • 2023-04-09
  • 2016-03-20
相关资源
最近更新 更多