2009-06-12 19 views
35

通常のDjangoビューで検証しているDjangoフォームがあります。私は純粋なエラーを抽出する方法を理解しようとしています(HTMLフォーマットなし)。以下は私が現時点で使用しているコードです。JSONで純粋なDjangoフォームエラーを返す

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

これで、私はDjangoの悪名高いプロキシオブジェクトエラーを取得します。それぞれのエラーをUnicodeに強制することは、どちらのトリックも行いません。なぜなら、それぞれのエラー '__unicode__メソッドは効果的にHTML化されるからです。

アイデア?

EDIT:、これは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') 
+0

受け入れられる回答は古くなっています。 https://stackoverflow.com/a/28256365/604511 – aitchnyu

答えて

24

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

return json_response({ 'success' : False, 
         'errors' : [(k, v[0].__unicode__()) for k, v in form.errors.items()] }) 
+5

を参照してください。また、 '__ unicode __()'を呼び出すのではなく、 'v.'(ErrorList)の' form.error_class.as_text(v) 'を"v"の各項目 – tehfink

+3

errors = dict(form.errors.items()]のkの場合は、[(k、form.error_class.as_text(v))) return json_response({"errors":errors}) – digitalPBK

+2

より良い構造を提供するために、次のものが見つかりました。また、1つ以上のエラーが発生したアイテムにも対応しています: 'k:v for k、v ['signup_form']。errors.items()}' – DanH

4

エラーメッセージは遅延変換オブジェクトです。 docsには次のように書かれています:

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

+0

それは行く方法です。私はこのアプローチにいくつかの詳細を与える答えを加えました。 – bjunix

30

これは改善されたようです。 Djangoの1.3で、次の作品:

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

それ以上の__unicode__または遅延翻訳の必要はありません。これはまた、各フィールドに完全なエラーの配列を与えます。

+0

これは動作しないようです – digitalPBK

+0

@digitalPBKは精巧に注意してください? – SystemParadox

+1

form.errorsを使用したときと同じエラーが発生しました。(いくつかのLazyクラス)オブジェクトは直列化できません。 – digitalPBK

1

我々はこれを行うことができます:

import simplejson as json 

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

json.dumpsは、Djangoのプロキシ機能をシリアル化することはできません(遅延翻訳のように)。

新しいエンコーダークラスを作成する必要がありdocumentedとして:DjangoはForm.errors.as_json()かを使用して1.7以上の場合は、すべての:)

19

json.dumps(s, cls=LazyEncoder) 

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) 

は、このような新しいエンコーダを使用してくださいこのようなもの:

errors = {f: e.get_json_data() for f, e in form.errors.items()} 
return json_response(success=False, data=errors) 
関連する問題