42

通常の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')
4

6 に答える 6

37

これは改善されたようです。以下はDjango1.3で動作します。

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

もはや翻訳の必要性__unicode__や怠惰な翻訳はありません。これにより、各フィールドのエラーの完全な配列も得られます。

于 2012-01-12T14:47:09.553 に答える
32

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)
于 2015-03-03T21:08:55.237 に答える
25

いろいろなことをテストして、いじり回した後、それを手に入れました。NBこれが国際化でも機能するかどうかはわかりません。これも各フィールドの最初の検証エラーを取りますが、すべてのエラーを取得するように変更するのはかなり簡単です。

return json_response({ 'success' : False,
                       'errors' : [(k, v[0].__unicode__()) for k, v in form.errors.items()] })
于 2009-06-12T13:04:00.770 に答える
4

ここでの問題は、エラーメッセージが遅延変換オブジェクトであるということです。ドキュメントはこれについて言及しています:

sure_ascii = Falseであることを確認し、LazyEncoderを使用してください。

于 2009-06-12T20:42:10.437 に答える
1

できるよ:

import simplejson as json

errors = json.dumps(form.errors)
return HttpResponse(errors, mimetype='application/json')
于 2014-04-07T16:01:54.233 に答える
1

json.dumpsdjangoのプロキシ機能をシリアル化することはできません(怠惰な翻訳のように)。

文書化されているように、新しいエンコーダクラスを作成する必要があります。

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)

それで全部です :)

于 2014-09-11T09:14:35.690 に答える