首页 文章

表单ValidationError和错误代码

提问于
浏览
16

在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 )未在任何地方传递,并且在表单验证后无法获取 .

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

2 回答

  • 1

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

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

    >>> print(form.errors.as_json())
    {"__all__": [
        {"message": "Your account has not been activated.", "code": "inactive"}
    ]}
    
  • 16

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

    try:
        ...
        raise ValidationError(u'Oops', code=0x800)
        ...
    
    except ValidationError as e:
        print "Error code: ", e.code
    

相关问题