Возвращение чистых ошибок формы Django в JSON
-
13-09-2019 - |
Вопрос
У меня есть форма Django, которую я проверяю в обычном виде Django. Я пытаюсь выяснить, как извлечь чистые ошибки (без форматирования HTML). Ниже приведен код, который я использую в данный момент.
return json_response({ 'success' : False,
'errors' : form.errors })
При этом я получаю печально известную ошибку объекта прокси от Django. Принуждение каждой ошибки в Unicode тоже не сделает трюк, потому что тогда каждая из ошибок ' __unicode__
Метод будет называться эффективно HTML-уменьшать его.
Любые идеи?
РЕДАКТИРОВАТЬ:
Для тех, кто заинтересован, это определение json_response
:
def json_response(x):
import json
return HttpResponse(json.dumps(x, sort_keys=True, indent=2),
content_type='application/json; charset=UTF-8')
Решение 2
Получил его после много общаться, тестирование разных вещей. NB Я не уверен, работает ли это и с интернационализацией. Это также требует первой ошибки проверки для каждого поля, но изменение ее, чтобы получить все ошибки, должно быть довольно простым.
return json_response({ 'success' : False,
'errors' : [(k, v[0].__unicode__()) for k, v in form.errors.items()] })
Другие советы
Похоже, это было улучшено. Следующие работы в Django 1.3:
return json_response({
'success': False,
'errors': dict(form.errors.items()),
})
Нет необходимости __unicode__
или ленивый перевод еще больше. Это также дает полный массив ошибок для каждого поля.
Для Django 1.7+ использования Form.errors.as_json () или что -то вроде этого:
errors = {f: e.get_json_data() for f, e in form.errors.items()}
return json_response(success=False, data=errors)
Проблема здесь в том, что сообщение об ошибке - это ленивый объект перевода. А док Упомяните это:
Просто убедитесь, что у вас есть убедитесь_асии = false и используйте Lazyencoder.
Мы можем сделать это:
import simplejson as json
errors = json.dumps(form.errors)
return HttpResponse(errors, mimetype='application/json')
json.dumps
Не могу сериализовать прокси -функцию Джанго (например, ленивые переводы).
В качестве документирован Вы должны создать новый класс Encoder:
import json
from django.utils.functional import Promise
from django.utils.encoding import force_text
from django.core.serializers.json import DjangoJSONEncoder
class LazyEncoder(DjangoJSONEncoder):
def default(self, obj):
if isinstance(obj, Promise):
return force_text(obj)
return super(LazyEncoder, self).default(obj)
Используйте новый энкодер, как это:
json.dumps(s, cls=LazyEncoder)
Это все :)