将错误注入已验证的表单?
Posted
技术标签:
【中文标题】将错误注入已验证的表单?【英文标题】:Inject errors into already validated form? 【发布时间】:2010-09-16 09:02:06 【问题描述】:在我的form.Form
验证用户输入值后,我将它们传递给单独的(外部)进程以进行进一步处理。此外部过程可能会在值中发现更多错误。
有没有办法将这些错误注入到已经验证的表单中,以便它们可以通过通常的表单错误显示方法显示(或者有更好的替代方法)?
一个建议是在表单验证中包含外部处理,这并不理想,因为外部处理不仅仅是验证。
【问题讨论】:
【参考方案1】:向特定字段添加错误:
form.add_error('fieldName', 'error description')
**向非字段添加错误**
form.add_error(None, 'error description')
#Only pass None instead of field name
【讨论】:
【参考方案2】: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"
。
【讨论】:
这似乎有点令人不快,因为名称“_errors”表明它应该是表单类的内部。这是在 Django 中执行此操作的标准方法吗?我的情况与 OP 类似:我有一个表单,用户提供一个新名称,该名称在数据库中必须是唯一的。如果发生冲突,我想将带有错误的表单发回,但直到我真正尝试进行数据库插入时我才会知道。 (理论上,验证器可以检查数据库,但那很臭,而且很容易竞争。) @scompt:谢谢,已修复。 @Weeble:_errors
是公共表单 API 的一部分,尽管它的名称如此;有关文档链接,请参阅 insin 的答案。
这是非常非 Python 的。实现 form.errors['myfield'].append(my_error) 或 form.add_error('myfield', my_error) 有多难?当前实施中存在很大的错误空间(没有双关语)。
大部分是完整的。一个额外的注意是,如果 is_valid() 没有被调用,那么你需要设置 form._errors = ErrorDict()
@Michael - 看起来他们采纳了你的建议...Django Dev - Form.add_error(field, error)【参考方案3】:
对于 Django 1.7+,您应该使用 form.add_error()
而不是直接访问 form._errors
。
文档:https://docs.djangoproject.com/en/stable/ref/forms/api/#django.forms.Form.add_error
【讨论】:
【参考方案4】:您可以直接向表单的_errors
属性添加其他错误详细信息:
https://docs.djangoproject.com/en/1.5/ref/forms/validation/#described-later https://docs.djangoproject.com/en/1.6/ref/forms/validation/#modifying-field-errors
【讨论】:
显然在 1.6 后的开发版本中,他们正在添加一个add_error
函数:docs.djangoproject.com/en/dev/ref/forms/api/…
现在 Django 1.7 有了官方的 add_error 函数:docs.djangoproject.com/en/1.7/ref/forms/api/…以上是关于将错误注入已验证的表单?的主要内容,如果未能解决你的问题,请参考以下文章