JSONで純粋なDjangoがエラーを形成することを返す
-
13-09-2019 - |
質問
私は通常の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)
それで全部です :)