将错误注入已经验证的表格中吗?


97

form.Form验证用户输入值之后,我将它们传递给单独的(外部)过程以进行进一步处理。此外部过程可能会发现值中的其他错误。

是否有办法将这些错误注入已验证的表单中,以便可以通过常规的表单错误显示方法来显示它们(或者是否有更好的替代方法)?

一个建议是将外部处理包括在表单验证中,这是不理想的,因为外部过程所做的不只是验证。

Answers:


92

Form._errors可以像标准字典一样对待。使用ErrorList该类并将错误附加到现有列表被认为是一种很好的形式:

from django.forms.utils import ErrorList
errors = form._errors.setdefault("myfield", ErrorList())
errors.append(u"My error here")

如果要添加非字段错误,请使用django.forms.forms.NON_FIELD_ERRORS(默认为"__all__")代替"myfield"


2
这似乎有点不愉快,因为名称“ _errors”表明它应该在表单类内部。这是在Django中执行此操作的标准方法吗?我与OP的情况类似:我有一个表单,用户可以在其中提供一个在数据库中必须唯一的新名称。如果发生冲突,我想将表单发回错误,但是直到实际尝试执行数据库插入操作时我才知道。(理论上验证者可以检查数据库,但是它闻起来很容易产生种族歧视。)
Weeble 2010年

1
@scompt:谢谢,固定。@Weeble:_errors尽管是名称,它还是公共表单API的一部分;有关文档链接,请参见insin的答案。
约翰·米利金

18
这是不可思议的非pythonic。实现form.errors ['myfield']。append(my_error)或form.add_error('myfield',my_error)有多难?当前实现中有很大的错误空间(无双关语)。
Michael

2
大部分完成。还有一点需要注意的是,如果未调用is_valid(),则需要设置form._errors = ErrorDict()
jacob

12
@Michael-好像他们接受了您的建议... Django Dev-Form.add_error(field,error)
Clayton


14

6
而且很显然,在后发展1.6版本,他们增加了add_error:功能docs.djangoproject.com/en/dev/ref/forms/api/...
brianmearns

现在Django 1.7具有正式的add_error函数:docs.djangoproject.com/en/1.7/ref/forms/api/…–
Danilo Cabello

0

向特定字段添加错误:

form.add_error('fieldName', 'error description')

**向非字段添加错误**

form.add_error(None, 'error description')
#Only pass None instead of field name
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.