Подтвердить что ты не робот

Формы 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) не передается нигде и не может быть получен после проверки формы.

Может кто-нибудь объяснить, в чем цель использования этого кода ошибки?

4b9b3361

Ответ 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