2013-09-13 2 views
13

В документации Django https://docs.djangoproject.com/en/dev/ref/forms/validation/#raising-validationerror сказал, что это хорошая практика для получения кода ошибки при сбое исключения ValidationError.Forms 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) не передается в любом месте и не может быть получен после проверки формы.

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

+0

Похоже, что это новое дополнение - смотрите примечание, которое говорит «Новое в 1.6», который даже еще не выпустили - так что, вероятно, это не полностью реализованы повсеместно. –

+0

Это поле также представлено в 1.5. Похоже, вы правы, и это то, что можно использовать в будущей версии. – GreyZmeem

ответ

11

В 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"} 
]} 
1

Посмотрите на определение ValidationError в Джанго СРК, он используется как удобный способ передать дополнительный идентификатор (аналог e.errno в стандартном исключения питона), вы можете использовать его как это:

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

except ValidationError as e: 
    print "Error code: ", e.code 
+0

Спасибо за ответ! Итак, если я хочу сохранить значение этого кода после проверки формы, мне нужно переписать метод _clean_fileds? – GreyZmeem

+0

, или см. Комментарий Даниэля выше, они, вероятно, все еще работают над этим, поэтому лучше просто подождать, так что при обновлении у вас не будет несовместимости. – mariodev