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

Возвращение чистых ошибок формы Django в JSON

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

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

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

Любые идеи?

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')
4b9b3361

Ответ 1

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

return json_response({ 'success' : False,
                       'errors' : [(k, v[0].__unicode__()) for k, v in form.errors.items()] })

Ответ 2

Это, кажется, было улучшено. В Django 1.3 работает следующее:

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

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

Ответ 3

Для 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)

Ответ 4

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

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

Ответ 5

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

import simplejson as json

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

Ответ 6

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

В качестве documented вы должны создать новый класс 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)

Используйте новый Encoder следующим образом:

json.dumps(s, cls=LazyEncoder)

Что все:)