Django - 表单 Clean() 和字段错误

Posted

技术标签:

【中文标题】Django - 表单 Clean() 和字段错误【英文标题】:Django - form Clean() and field errors 【发布时间】:2012-04-15 15:31:36 【问题描述】:

我正在尝试在 clean() 表单中设置字段错误,我目前正在这样做:

self._errors['address'] = self._errors.get('address', ErrorList())
self._errors['address'].append(_(u'Please specify an address.'))

有没有更好的,如果可能的话更短的方法来做到这一点?

【问题讨论】:

使用 self.errors 代替,它返回 _errors 并且不是私有的 【参考方案1】:

Django 1.7 中的新功能是Form.add_error( field, message )

https://docs.djangoproject.com/en/dev/ref/forms/api/#django.forms.Form.add_error

【讨论】:

【参考方案2】:

也许这会对你有所帮助。它通常首选您覆盖 clean 并且在函数内部您可以执行以下操作

如果你想提出表单特定的错误,你可以这样做。

self._errors["field"] = ErrorList([u"Error"])

这是确保你得到错误类

如果你有一个非字段错误,你可以像这样简单地引发一个验证错误

raise forms.ValidationError(_("Error"))

希望这会有所帮助。

【讨论】:

【参考方案3】:
    标准方式是raise ValidationError(message)。 将特定于字段的验证移至clean_<fieldname>() 方法,在您的情况下为clean_address。在这种方法中引发的ValidationError 会将错误消息附加到特定字段。从clean() 筹集的一个将归于一般模型。

【讨论】:

我目前正在使用clean() 来验证与多个字段相关的某些内容——我对 Django 和 Python 很陌生,我想知道是否有更好/更短的检查方法/创建/附加字段特定错误。 添加了第 3 项,也许它描述了您的需求。取自 django 的内部实现 clean_fields 你能扩展你的建议#3吗?它对我不起作用。我可以看到 ValidationError class 接受这样的错误字典,但 Forms._clean_form 实际上并没有使用它。 @AlexLebedev - 我还没有测试你的第三个建议,但根据文档是不正确的,不是吗?设置字段特定错误时,应将消息分配给self._errors 你说得对,我混淆了表单和模型验证。 #3 仅适用于模型。

以上是关于Django - 表单 Clean() 和字段错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 clean 更改 Django formset 中的字段

Django:覆盖表单中的 clean() 方法 - 关于引发错误的问题

Django表单字段汇总

[oldboy-django][2深入django]form表单clean_xx, clean完成数据验证+ form错误信息

即使缺少所需的值,Django 验证也会调用 clean()

Django:如何显示不特定于字段的验证错误?