如何在Django中将错误消息添加到form.non_field_errors?
我有一个表单,里面有好几个输入框。我为每个输入框都设置了单独的验证检查,这些都是通过表单的验证功能来完成的。不过,我还需要在把用户转到另一个页面之前,检查几个特定的输入框是否填写了内容。我希望能把错误信息加到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 个回答
在表单中,有一个叫做 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() 源码
这段内容有点过时,但我最近遇到了同样的问题,想给未来的读者提供一些额外的帮助。
- 从Django 1.6版本开始,错误信息会存储在form.errors里,而不是form._errors里。
- 当你调用form.is_valid()时,这相当于执行了full_clean()这个方法。
- 你不需要单独导入NON_FIELD_ERRORS,可以直接使用它的默认字典键
__all__
。
示例:
if form.is_valid():
form.errors['__all__'] = form.error_class(['Your Error Here!'])
调用 full_clean(),这个步骤会初始化
form._errors
。这一步非常重要,如果不这样做,就无法正常工作。创建错误列表,它需要一个消息列表,可以这样实例化:
error_list = form.error_class(['你的错误信息'])
将错误列表分配给 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']