2017-07-11 6 views
1

Djangoモデルから生成されたJSON文字列をテンプレートのjavascript静的ファイルに渡すことができない理由を突き止めようとしています。結局のところ、問題はモデルレベルではなく(serializers.serializeを使って)、スクリプト自体に同じ文字列を入れても正常に解析されますが、文字列を渡すことはできません。JSON文字列をDjangoテンプレートに渡す

views.py:

def texas(request): 
    test_json = '{"incidents": [{"field1": 1, "field2": 2}], "debug": 1}' 
    return render(request, 'tx/texas.html', {'tx': test_json}) 

TX/texas.html:

{% load staticfiles %} 

<html> 
    <head> 
     <title>texas map</title> 
    </head> 
    <body> 
     <p id='texas'></p> 
     <script> 
      function load_texas() { 
       return '{{ tx }}'; 
      } 
     </script> 
     <script src="{% static 'js/texas.js' %}"></script> 
    </body> 
</html> 

JS/texas.jsはJSON.parseで失敗:

:JSONデータの行1、列2で予想プロパティ名または '}'
var json_data = load_texas(); 

var paragraph = document.getElementById('texas'); 
try { 
    paragraph.innerHTML = JSON.parse(json_data); 
} 
catch(err) { 
    paragraph.innerHTML = err.message; 
} 

が、同じ文字列がちょうどスクリプトで入力された場合に成功する:

// this JSON string is identical to the one passed in views.py 
var json_data = '{"incidents": [{"field1": 1, "field2": 2}], "debug": 1}'; 

私は、Djangoはコンテキスト変数を処理する方法について何かが足りないのですか?

編集:文字列を渡すため

ないかなりの修正が、私は今のjavascriptへのモデルを得ることの私の元の問題を解決し、テンプレートに直接JSONオブジェクトを渡しています。

views.py:

from django.shortcuts import render 
from django.core import serializers 
import json 
from .models import Tx 

def texas(request): 
    tx_database = Tx.objects.all() 

    # Django serialize puts square brackets around the string, 
    # so slice them off. 
    json_string = serializers.serialize('json', tx_database)[1:-1] 

    # Load string into JSON object... is this best practice? 
    test_json = json.loads(json_string) 
    return render(request, 'tx/texas.html', {'tx': test_json}) 
+0

(Chromeデベロッパーツールなどで)読み込んだ後のhtmlの外観を確認しましたか? json文字列の周りに二重引用符がありますか? –

+0

@ ger.s.brettテキストは引用符なしでhtmlに表示されます。 – ultraturtle0

答えて

2

あなたは自動エスケープを無効にする必要があります。

return '{{ tx|safe }}'; 

実際、JSONデータをビュー内に文字列として作成しないでください。それをPythonデータ構造として作成し、json.dumps()を使用します。

+0

'safe'の使用を忘れましたが、文字列を渡すときに違いがないようです。私の編集した質問では、 'json.loads()'を使ってJSONオブジェクトとしてモデルを渡し始めました(Djangoのシリアライザモジュールが文字列表現を吐き出しているため)。これよりも優れたDjangoのプラクティスがあります? – ultraturtle0

+0

それは理にかなっていません。テンプレートに渡す前にJSONをPythonデータ構造に変換したいのはなぜですか? –

+0

あなたは正しい、それは意味をなさない。上記の単純な例のために働いていましたが、今は 'ReferenceError:None is not defined'を取得しています。 – ultraturtle0

関連する問題