2012-04-05 9 views
11

JSからのAJAX呼び出しとサーバー側で複合JSON構造を渡すには、Pythonの「非常によく似た」データ構造として読んでください。Django:QueryDictからJSONオブジェクトの配列を読み取る

私はjsonの書式設定(simplejsonなど)を使用することができますが、私はどういうわけか、自分のケースでは、QueryDict自体が不正形式か再フォーマットされていると感じていますか?

例:

JSONオブジェクトの配列を渡す[{ "ID":1}、{ "ID":2}、{ "ID":3}] DjangoのビューにAJAXを介して、のQueryDict

POST:<QueryDict: {u'json_data[0][id]': [u'1'], u'type': [u'clone'], 
u'csrfmiddlewaretoken': [u'69bb3c434ced31ab301ede04bf491ec0'], 
u'json_data[1][id]': [u'2'], u'json_data[2][id]': [u'3']}> 

json_dataを繰り返し処理するにはどうすればよいですか?私は辞書としてのQueryDictにアクセスして、特定の順序でリストとそれを処理としてjson_data取得できるように

POST:<QueryDict: {u'json_data': [{u'id': [u'1']}, {u'id': [u'2']}, {u'id': [u'3']}]}, 
u'csrfmiddlewaretoken': [u'69bb3c434ced31ab301ede04bf491ec0'], u'type': [u'clone']> 

は私の代わりにこのような何かを取得したいだけかもしれないシーケンシャルでそれらを反復処理リストの順序。以下のような 何か::実際には

ret = request.POST 
for item in ret['json_data']: 
    process(item['id']) 

プロセス(に入る値)は、キーと値のペアの別の辞書だけではなく数(1,2,3など)

Javascriptの可能性

var test = [{"id": 1},{"id": 2},{"id": 3}]; 
$.post(
    "/insert_tc", 
    { 
     json_data: test, 
     "type": 'clone', 
     "csrfmiddlewaretoken": $csrf_token 
    }, 
    function(json) { 
     //CALLBACK 
    }, 
    "json" 
); 

views.py:

def insert_tc(request): 
    if request.method == 'POST':  
    ret = request.POST 
    type = ret['type'] 
    list = ret.getlist(ret) 

リストは空を返します

シンプルジェンダンプ、ロード、アイテム、メソッドを取得しようとしましたが、どれも役に立たなかった。

私はjQuery.param(obj、true)を試したこともありますが、それは私が望むものではありません。

複合データ構造をDjango < - > JS via AJAXに渡す方法がありますか?

+0

掲載されたコードは、間違いなくそののQueryDict結果が得られないので何かが、確かに間違っています。それを出力する正確なコードを投稿できますか? –

+0

私はJSコードが正確であることを恐れています。私はJSスニペットと印刷要求の出力をviews.pyから小さな書式で貼り付けてコピーします。 'test'は私が渡しているオブジェクトの配列です。 – rajivRaja

+0

申し訳ありませんが、私の間違いです。下の私の答えを見てください。 –

答えて

12

JSON.stringify()を使用してJSONをストリング化する必要があります。これは、JSONオブジェクトを文字列形式に変換して、もう一方の端で正しく解析できるようにします。もう一方では、json.loads()を使用してオブジェクトを「元に戻す」必要があります。

ジャバスクリプト

var test = [{"id": 1},{"id": 2},{"id": 3}]; 
$.post(
    "/insert_tc", 
    { 
     json_data: JSON.stringify(test), 
     "type": 'clone', 
     "csrfmiddlewaretoken": $csrf_token 
    }, 
    function(json) { 
     //CALLBACK 
    }, 
    "json" 
); 

ビュー

import json 
def insert_tc(request): 
    if request.method == 'POST':  
     ret = request.POST 
     type = ret['type'] 
     list = json.loads(ret['json_data']) 
+0

ありがとう!ダニエルの答えは時宜にかかっていて、私がハードルを乗り越えるのに本当に役立ちましたが、私はJSON.stringify()が仕事をよりきれいにするので、これを受け入れられた答えに切り替えることになります。 – rajivRaja

+1

JSONはIEの古いバージョンでは使用できないようです。誰かが知りたいと思うと思った。しかし、それを行うにはまだ最善の方法のようだ。 – misterte

7

これは実際にjQueryであり、Djangoではなく、不思議です。 test変数にはJSONではなく実際のJSオブジェクトが含まれています。 jQueryは、それ自体が最もよく知られている理由から、投稿する前にこれをいくつかの非常に奇妙な形式に解析します。結果は得られます。あなたの代わりにこれをしなかった場合は(全部の周りに引用符に注意してください):あなたが行う必要がある唯一のものはjson.loads(ret['json_data'])を呼び出すことです:

var test = '[{"id": 1},{"id": 2},{"id": 3}]'; 

あなたは非常に近いのQueryDictは、あなたが期待し得る見つけるだろう。

私は理解できない理由でも。 jQueryには、オブジェクトの配列をJSONに変換する機能はありません。あなたはそれのためのプラグインまたは別のライブラリを見つける必要があります。

+1

人道に対する私の信念が回復しました。ありがとうございました!私はほとんどそれを働かせました。この動作の背後にある理由を知ることは素晴らしいことです(書き込み/リンクの可能性はありますか?) – rajivRaja

関連する問題