Вопрос

У меня есть форма 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)

Это все :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top