Возврат чистых ошибок формы Django в JSON - PullRequest
36 голосов
/ 12 июня 2009

У меня есть форма Django, которую я проверяю в обычном представлении Django. Я пытаюсь выяснить, как извлечь чистые ошибки (без форматирования HTML). Ниже приведен код, который я использую в данный момент.

return json_response({ 'success' : False,
                       'errors' : form.errors })

С этим я получаю печально известную ошибку прокси-объекта от Django. Заставить каждую ошибку в Юникоде тоже не сработает, потому что тогда каждый из ошибок __unicode__ будет эффективно вызываться из HTML.

Есть идеи?

EDIT:

Для тех, кто заинтересован, это определение 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')

Ответы [ 6 ]

32 голосов
/ 12 января 2012

Похоже, что это было улучшено. Следующие работы в Django 1.3:

return json_response({
    'success': False,
    'errors': dict(form.errors.items()),
})

Больше не нужно __unicode__ или ленивый перевод. Это также дает полный массив ошибок для каждого поля.

24 голосов
/ 04 марта 2015

Для 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)
24 голосов
/ 12 июня 2009

Получил это после лота возни, тестируя разные вещи. Нотабене Я не уверен, работает ли это с интернационализацией также. Это также принимает первую ошибку проверки для каждого поля, но изменить ее, чтобы получить все ошибки, должно быть довольно легко.

return json_response({ 'success' : False,
                       'errors' : [(k, v[0].__unicode__()) for k, v in form.errors.items()] })
4 голосов
/ 13 июня 2009

Проблема здесь в том, что сообщения об ошибках ленивого объекта перевода. документы упоминают это:

Просто убедитесь, что у вас есть sure_ascii = False и используйте LazyEncoder.

1 голос
/ 11 сентября 2014

json.dumps не может сериализовать прокси-функцию django (например, ленивые переводы).

Как задокументировано , вы должны создать новый класс кодировщика:

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)

Вот и все:)

1 голос
/ 07 апреля 2014

Мы можем сделать это:

import simplejson as json

errors = json.dumps(form.errors)
return HttpResponse(errors, mimetype='application/json')
...