将JSON字符串传递给Django模板

时间:2017-07-11 01:44:07

标签: javascript python json django

我一直在撞墙,试图找出为什么我不能将Django模型生成的JSON字符串传递到模板的javascript静态文件中。事实证明,问题不在模型级别(使用serializers.serialize) - 在脚本中放置一个相同的字符串将成功解析,但传入字符串将不会:

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处理上下文变量的方式?

编辑:

传递字符串并不是一个很好的修复,但我现在将JSON对象直接传递给模板,这解决了我将模型转换为javascript的原始问题。

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})

1 个答案:

答案 0 :(得分:2)

您需要禁用自动转移功能。

return '{{ tx|safe }}';

注意,您确实不应该在视图中将JSON数据创建为字符串;将其创建为Python数据结构,然后使用json.dumps()