如何在Django中将错误消息添加到form.non_field_errors?

9 投票
4 回答
12992 浏览
提问于 2025-04-17 08:49

我有一个表单,里面有好几个输入框。我为每个输入框都设置了单独的验证检查,这些都是通过表单的验证功能来完成的。不过,我还需要在把用户转到另一个页面之前,检查几个特定的输入框是否填写了内容。我希望能把错误信息加到forms.non_field_errors里,因为这个错误不是针对某个特定的输入框,但我不太确定该怎么写代码。网上查了一下,我发现了……

form.errors['__all__'] = form.error_class(["error msg"])

这样可以显示错误信息,但似乎会影响到其他页面,如果我点击其他地方也会显示这个错误信息。

我试过

form._errors[NON_FIELD_ERRORS] = form.error_class()

结果出现了一个错误,提示'NoneType'对象没有'setdefault'这个属性。

我还试过

form.non_field_errors().append("Please complete your profile in order to access the content.")

但这似乎没有任何效果,我在页面上看不到错误信息。

那么,最好的解决办法是什么呢?理想情况下,我不想在表单的clean方法里处理这个。我觉得我应该能在视图里把错误信息加到表单里。

4 个回答

1

在表单中,有一个叫做 add_error 的方法。

class ExampleForm(forms.Form) :

    def clean(self) :
        self.add_error(None, "The __all__ error message")
        return super().clean()

add_error() 函数的第一个参数是指向相关字段的。如果这个字段是 None,那么 add_error() 函数就会认为这个错误是一个 form_error

clean() 方法是一个钩子,它是由 _clean_form() 调用的。然后,_clean_form() 函数又是由 full_clean() 调用的。想了解更多,可以查看这个链接:full_clean() 源码

5

这段内容有点过时,但我最近遇到了同样的问题,想给未来的读者提供一些额外的帮助。

  1. 从Django 1.6版本开始,错误信息会存储在form.errors里,而不是form._errors里。
  2. 当你调用form.is_valid()时,这相当于执行了full_clean()这个方法。
  3. 你不需要单独导入NON_FIELD_ERRORS,可以直接使用它的默认字典键__all__

示例:

if form.is_valid():
    form.errors['__all__'] = form.error_class(['Your Error Here!'])
18
  1. 调用 full_clean(),这个步骤会初始化 form._errors。这一步非常重要,如果不这样做,就无法正常工作。

  2. 创建错误列表,它需要一个消息列表,可以这样实例化:error_list = form.error_class(['你的错误信息'])

  3. 将错误列表分配给 NON_FIELD_ERRORS,你需要从 django.forms.forms 导入 NON_FIELD_ERRORS,然后这样分配:form._errors[NON_FIELD_ERRORS] = error_list

下面是一个在命令行中的示例:

In [1]: from bet.forms import BetForm

In [2]: from django.forms.forms import NON_FIELD_ERRORS

In [3]: form = BetForm()

In [4]: form.full_clean()

In [5]: form._errors[NON_FIELD_ERRORS] = form.error_class(['your error messages'])

In [6]: form.non_field_errors()
Out[6]: [u'your error messages']

撰写回答