2013-03-23 6 views
21

私はプロジェクト用のWebベースのアプリケーションを作成するためにDjangoを使用していますが、Djangoビューからテンプレートに配列を返す問題が発生しています。JSON配列をDjangoビューからテンプレートに戻す

この配列は、JavaScript(JQuery)スクリプトがページに表示されているイメージ上にボックスを描画するために使用されます。したがって、この配列は、とりわけ、描画されるボックスの座標を持ちます。

これは、必要なデータを取得し、JSONとしてそれをシリアル化するために使用さDjangoのビュー内のコードです:デバッグの方法として

def annotate(request, ...): 
    ... 
    oldAnnotations = lastFrame.videoannotation_set.filter(ParentVideoLabel=label) 
    tags = serializers.serialize("json", oldAnnotations) 
    ... 
    return render_to_response('vannotate.html', {'tags': tags, ...}) 

、テンプレートのHTML部分に{{ tags }}を使用すると、出力としてこれを提供します(長い行に申し訳ありません):

[{"pk": 491, "model": "va.videoannotation", "fields": {"ParentVideoFile": 4, "ParentVideoFrame": 201, "ParentVideoLabel": 4, "top": 220, "height": 30, "width": 30, "ParentVideoSequence": 16, "left": 242}}, {"pk": 492, "model": "va.videoannotation", "fields": {"ParentVideoFile": 4, "ParentVideoFrame": 201, "ParentVideoLabel": 4, "top": 218, "height": 30, "width": 30, "ParentVideoSequence": 16, "left": 307}}] 

私はJSON配列の正しい形式と仮定します。次のように

後でテンプレートで、私は、実際にテンプレートのJavaScriptの部分にtags変数を使用しようとする:

{% if tags %} 
    var tagbs = {{ tags|safe }}; 
    var tgs = JSON.parse(tagbs); 
    alert("done"); 
{% endif %} 

私はvar tgs = JSON.parse(tagbs);行を削除した場合、警告ボックスが細かいポップアップ表示します残りのJavaScriptは期待どおりに動作します。しかし、この行を残してスクリプトを壊す。

Djangoモデルのすべてのオブジェクトを繰り返し処理し、JavaScriptのフィールド値を取得したいと考えています。

私はここで間違っているのか分かりませんが、誰かがこれを行う正しい方法を指摘できますか?

+1

JavaScriptにデータを送信しておらず、サーバー側にスクリプトを注入しているため、コードはクライアント上でJavaScriptとして解釈されます。ソースを見ると、通常の配列リテラルであることがわかります。この文脈ではJSONではないので、解析することはできません。 –

答えて

34

JSON Javascriptのソースコードです。私。配列のJSON表現は、配列を定義するために必要なJavascriptソースコードです。後にそう

var tagbs = {{ tags|safe }}; 

tagbsは、必要なデータを含むJavaScriptの配列です。 WebブラウザがすでにJavaScriptのソースコードとして解析しているため、JSON.parse()を呼び出す必要はありません。

だから、

var tagbs = {{ tags|safe }}; 
alert(tagbs[0].fields.ParentVideoFile); 

を行うことができる必要があり、それは "4" を示す必要があります。

+2

男、私はStackOverflowが大好きです。その小さな修正はすべてを解決しました!私はこれを初めて知ったので、JSON.parseはJSON変数を配列に解析することだと考えました。本当にありがとう! – DefPlayr

+0

ここで '| safe'を使うべきではありません。これはHTMLサニタイズにのみ必要です。 JSONはすでにこの安全なJavaScriptを作成していますが、どのHTMLコンテンツもエスケープしないでください。 –

+2

Hmmm、 'safe'を削除しようとしましたが、うまくいきません。 – DefPlayr

4

のデータをJSON-ifyにする場合; JSONはJavascriptが実際に(それは一部だすでにある:tagsはすでにJSON(したがって、JavaScriptの)データであり、直接を挿入することができる

{% if tags %} 
    var tgs = {{ tags }}; 
{% endif %} 

注;エスケープする必要はありません(ないHTMLがここにありません、それは代わりにJavaScriptのです。)

それとも、まっすぐテンプレート(annotate方法でserializers.serializeをコールする必要はありません)で、このDjango snippetを使用して、それを行うことができます:

var tgs = {{ tags|jsonify }}; 
+0

'jsonify'フィルタ定義を' views'ファイルに入れていますか?私はリンクの指示に従ってみましたが、Djangoは 'jsonify'フィルタが無効であると私に伝えます。 – DefPlayr

+0

@ user2203255: 'models.py'と' views.py'の隣に新しい 'templatetags'サブパッケージ(' __init __。py'ファイルを持つディレクトリ)を入れてください(https://docs.djangoprojectを参照)。 com/ja/dev/howto/custom-template-tags/ –

+0

素晴らしいですね。そしてそれは後で物事を簡素化します。しかし、一つです。それを動作させるために、 'safe {' {{tags}}}に余分なパイプを追加しなければなりませんでした。おそらくそれは私のオブジェクト自体と関係するものです。 – DefPlayr

2

simplejsondjango.utilsから使用することもできます。 Like:

JSの側からすべてのデータを解析してアクセスできます。

+4

[Django 1.5](https://docs.djangoproject)で廃止されました。これは、あなたのPythonコードで 'json.dumps(...)'を実行し、それを渡します。 .com/en/dev/releases/1.5 /#システムバージョンのsimplejson-no-longer-used) – Ngenator

関連する問題