문제

나는 정상적인 django보기에서 검증하는 django 양식을 가지고 있습니다. 순수한 오류를 추출하는 방법 (HTML 서식없이)을 알아 내려고 노력하고 있습니다. 아래는 현재 내가 사용하고있는 코드입니다.

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

이를 통해 Django에서 악명 높은 프록시 객체 오류가 발생합니다. 각 오류를 유니 코드로 강제하면 각 오류가 발생하지 않기 때문입니다. __unicode__ 메소드는 효과적으로 HTML-yizing이라고합니다.

어떤 아이디어?

편집하다:

관심있는 사람들에게는 이것이 정의입니다 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)

여기서 문제는 오류 메시지가 게으른 번역 객체라는 것입니다. 그만큼 문서 이것을 언급하십시오 :

당신이 ende_ascii = false를 가지고 있는지 확인하고 LazyEncoder를 사용하십시오.

우리는 할 수있어:

import simplejson as json

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

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)

그게 다야 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top