【发布时间】:2017-12-14 21:32:40
【问题描述】:
我一直在拼命想弄清楚为什么我不能将 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 数据的第 1 行第 2 列出现 JSON.parse: expected property name or '}' 失败:
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})
【问题讨论】:
-
您是否检查过 html 加载后的外观(例如,使用 Chrome 开发人员工具等)? json字符串周围会不会有双引号?
-
@ger.s.brett 文本出现在 html 中,不带引号。
标签: javascript python json django