【问题标题】:Passing JSON strings to Django templates将 JSON 字符串传递给 Django 模板
【发布时间】: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


【解决方案1】:

您需要禁用自动转义。

return '{{ tx|safe }}';

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

【讨论】:

  • 我忘记了使用safe,但在传递字符串时似乎没有什么不同。您可以在我编辑的问题中看到,我开始使用 json.loads() 将我的模型作为 JSON 对象传递(因为 Django serializer 模块会输出字符串表示形式),这是可行的,但是有比这更好的 Django 实践吗?
  • 不,这没有意义。为什么要在传递给模板之前将 JSON 转换回 Python 数据结构?
  • 你说得对,这没有意义。它适用于上面的简单示例(如何?)但现在我得到ReferenceError: None is not defined
猜你喜欢
  • 2013-10-21
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2021-01-28
  • 2012-11-01
  • 2021-02-24
相关资源
最近更新 更多