Python 如何将错误消息附加到django中的form.non_field_errors?
我有一个有几个字段的表单。我通过表单验证对每个字段进行单独的验证检查。但是,在将用户重定向到其他视图之前,我还需要检查是否填写了几个字段。我希望我能以某种方式将错误附加到forms.non_field_errors,因为它不适用于特定字段,但我不确定正确的语法是什么。我在网上查了一下,发现Python 如何将错误消息附加到django中的form.non_field_errors?,python,django,django-forms,Python,Django,Django Forms,我有一个有几个字段的表单。我通过表单验证对每个字段进行单独的验证检查。但是,在将用户重定向到其他视图之前,我还需要检查是否填写了几个字段。我希望我能以某种方式将错误附加到forms.non_field_errors,因为它不适用于特定字段,但我不确定正确的语法是什么。我在网上查了一下,发现 form.errors['__all__'] = form.error_class(["error msg"]) 这会显示错误消息,但它似乎也会弄乱其他页面,如果单击其他任何内容,则会显示错误消息 我试过了
form.errors['__all__'] = form.error_class(["error msg"])
这会显示错误消息,但它似乎也会弄乱其他页面,如果单击其他任何内容,则会显示错误消息
我试过了
form._errors[NON_FIELD_ERRORS] = form.error_class()
这会导致“非类型”对象没有属性“setdefault”错误
我试过了
form.non_field_errors().append("Please complete your profile in order to access the content.")
这似乎没有任何作用,我看不到视图上的错误消息
最好的方法是什么?理想情况下,我不想用表单的干净方法来做。我觉得我应该能够在视图中的表单中附加一个错误
表单。\u错误
。这一步很关键,如果你不这样做,它就不会起作用error\u list=form.error\u class(['your error messages'))
django.forms.forms
导入非字段错误
,然后这样分配:form.\u错误[非字段错误]=错误列表
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']
这有点过时,但我最近遇到了同样的问题,我想为未来的读者进一步阐明这一点
\uuuuu all\uuuu
if form.is_valid():
form.errors['__all__'] = form.error_class(['Your Error Here!'])
self.\u errors.setdefault(“\uu all”\uuuu',ErrorList()).extend([“”])
我知道我可以用Form.clean()方法完成。不过,我更愿意在视图中执行此操作,只需在form.errors列表中添加一个错误,这可能吗?是的,这可能是我的答案证明的:)感谢jpic提供详细的答案。我将试用此代码并返回。很抱歉回复太晚,我已经外出度假了。请参考其他人的回答:这在Django 1.5中运行良好。最初的问题是关于在列表中添加错误(而不是完全替换列表)。提交人在对这一问题的第一次答复中进一步重申了这一点,显然被忽视了。这个答案实际上根本不能解决这个问题,因为它会在表单上覆盖所有现有的非字段错误时将其从表单中删除。一般来说,最好使用定义的常量,即非字段错误
覆盖其值\uuuuuuuuu
。另外,据我所知,在调用is\u valid()
之前设置非字段错误的目的是能够实际影响is\u valid()
的结果。我同意非字段错误常量部分,我只想指出一个替代方法。至于设置非字段错误,我想说的是,除非调用is\u valid()或full\u clean(),否则不会实例化非字段错误。如果您在运行任何一种方法之前尝试登录,您将得到一个KeyError。除非您想说的是在运行is\u valid()之前应该运行full\u clean()?这充满了错误信息:form.errors是访问内部列表表单的属性。\u errors。使用非字段错误作为常量是一种很好的做法,因为有一天开发人员可能会突然决定该常量应该与字符串“la_le_loo”等效。这就是为什么我们在语言中有常量——这样我们可以更容易地抽象和维护代码。此外,form.is_valid()并不等同于运行full_clean()。is_valid()调用form.errors,它调用full_clean来填充_errors字典。