Формы ValidationError и код ошибки
В документации по Django https://docs.djangoproject.com/en/dev/ref/forms/validation/#raising-validationerror говорится, что хорошей практикой является создание кода ошибки при создании исключения ValidationError.
# Good
ValidationError(_('Invalid value'), code='invalid')
# Bad
ValidationError(_('Invalid value'))
У меня есть API в моем приложении, и я использую форму для проверки входных данных.
Если форма недействительна, я хочу получить эти коды ошибок (а не сообщения об ошибках).
Итак, я посмотрел исходный код метода _clean_fields BaseForm:
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
) не передается нигде и не может быть получен после проверки формы.
Может кто-нибудь объяснить, в чем цель использования этого кода ошибки?
Ответы
Ответ 1
В Django 1.7 теперь вы можете получить исходные данные об ошибке из формы. Вы можете вызвать метод as_data()
на ErrorList
или ErrorDict
. Например: 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"}
]}
Ответ 2
Взгляните на определение ValidationError в django src, оно используется как удобный способ передать дополнительный идентификатор (аналогично e.errno
в стандартном исключении python), вы можете использовать его следующим образом:
try:
...
raise ValidationError(u'Oops', code=0x800)
...
except ValidationError as e:
print "Error code: ", e.code