将错误注入已验证的表单?

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/…

以上是关于将错误注入已验证的表单?的主要内容,如果未能解决你的问题,请参考以下文章

如何在表单中注入一些东西

即使在经过验证的输入上,我是不是也需要检查 sql 注入?

sql注入登录表单错误

Symfony 5 无法将 EntityManagerInterface 注入验证器

表单提交数据的验证处理,防SQL注入和XSS攻击等

谈谈PHP网站的防SQL注入