質問

私は通常の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__ またはこれ以上怠zyな翻訳。これにより、各フィールドに完全なエラーが提供されます。

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)

ここでの問題は、エラーメッセージが怠zyな翻訳オブジェクトであることです。 ドキュメント これに言及してください:

surse_ascii = falseを持っていることを確認し、lazyencoderを使用してください。

できるよ:

import simplejson as json

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

json.dumps Djangoのプロキシ関数をシリアル化することはできません(怠zyな翻訳など)。

として 文書化 新しいエンコーダークラスを作成する必要があります。

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