如何在django中将错误消息附加到form.non_field_errors?

Ang*_*ela 9 python django django-forms

我有一个有几个领域的表格.我通过表单验证对每个字段进行单独的验证检查.但是,在将用户重定向到不同视图之前,我还需要检查是否填写了少量字段.我希望我能以某种方式将错误附加到forms.non_field_errors,因为它不适用于特定字段,但我不确定这是什么正确的语法.我在网上查了一下,发现..

form.errors['__all__'] = form.error_class(["error msg"])
Run Code Online (Sandbox Code Playgroud)

这会显示错误消息,但它似乎也会弄乱其他页面,如果我点击其他任何内容,则会显示错误消息.

我试过了

form._errors[NON_FIELD_ERRORS] = form.error_class()
Run Code Online (Sandbox Code Playgroud)

这导致'NoneType'对象没有属性'setdefault'错误.

我试过了

form.non_field_errors().append("Please complete your profile in order to access the content.")
Run Code Online (Sandbox Code Playgroud)

这似乎没有做任何事情,我无法在视图上看到错误消息.

最好的方法是什么?理想情况下,我不想在表单的干净方法中这样做.我觉得我应该能够在视图中向表单添加错误.

jpi*_*pic 17

  1. 调用full_clean(),这应该初始化form._errors.此步骤至关重要,如果您不这样做,它将无法正常工作.

  2. 制作错误列表,它需要一个消息列表,将其实例化为:error_list = form.error_class(['your error messages'])

  3. 分配错误列表NON_FIELD_ERRORS,你必须输入NON_FIELD_ERRORSdjango.forms.forms,然后分配这样:form._errors[NON_FIELD_ERRORS] = error_list

这是shell的演示:

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']
Run Code Online (Sandbox Code Playgroud)


asa*_*aji 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!'])
Run Code Online (Sandbox Code Playgroud)

  • 总的来说,最好使用定义的常量,即。`NON_FIELD_ERRORS` 超过其值 `__all__`。另外,据我所知,在调用`is_valid()`之前设置非字段错误**的目的是能够实际影响`is_valid()`的结果。 (3认同)