22

在 Django 文档https://docs.djangoproject.com/en/dev/ref/forms/validation/#raising-validationerror中说,在引发 ValidationError 异常时提供错误代码是一种好习惯。

# Good
ValidationError(_('Invalid value'), code='invalid')

# Bad
ValidationError(_('Invalid value'))

我的应用程序中有 API,我正在使用表单来验证输入数据。
如果表单无效,我想获得这些错误代码(不是错误消息)。

所以我查看了BaseForm的_clean_fields方法的源代码:
https ://github.com/django/django/blob/master/django/forms/forms.py#L278

except ValidationError as e:
    self._errors[name] = self.error_class(e.messages)
    if name in self.cleaned_data:
        del self.cleaned_data[name]

据我了解,此参数 ( self.code) 未在任何地方传递,并且在表单验证后无法获取。

有人可以解释使用此错误代码的目的吗?

4

2 回答 2

24

在 Django 1.7 中,您现在可以从表单访问原始错误数据。您可以在or上调用该as_data()方法。例如:。这基本上为您提供了原始对象而不是消息本身。从这里您可以访问该属性,例如:。ErrorListErrorDictmy_form.errors.as_data()ValidationError.codemy_form.errors["__all__"].as_data()[0].code

您还可以序列化表单错误,非常适合 API:

>>> print(form.errors.as_json())
{"__all__": [
    {"message": "Your account has not been activated.", "code": "inactive"}
]}
于 2014-07-21T20:43:52.423 回答
2

看看 django src 中的 ValidationError 定义,它被用作传递附加标识符的便捷方式(类似于e.errno标准 python 异常),你可以像这样使用它:

try:
    ...
    raise ValidationError(u'Oops', code=0x800)
    ...

except ValidationError as e:
    print "Error code: ", e.code
于 2013-09-13T09:36:38.733 回答