【问题标题】:Inject errors into already validated form?将错误注入已验证的表单?
【发布时间】:2010-09-16 09:02:06
【问题描述】:

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

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

一个建议是在表单验证中包含外部处理,这并不理想,因为外部处理不仅仅是验证。

【问题讨论】:

    标签: django django-forms


    【解决方案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】:

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-31
        • 2019-11-26
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多