Django:在模板中使用JavaScript解析JSON

29 投票
5 回答
55487 浏览
提问于 2025-04-16 01:54

我在我的视图中有这个:

string_location = myaddress2
    geodata = []
    for place, (lat, lng) in g.geocode(string_location,exactly_one=False):
        geodata.append((place, (lat, lng)))

    geodata_results = len(geodata)

    data = {"geodata": geodata, "geodata_results":geodata_results }
    return render_to_response("business/business_view.html",
                              data, context_instance=RequestContext(request))

我该如何把 地理数据 转换成 JSON 格式,并传递给我的模板,这样我就可以像处理数组一样“循环”它呢?

我这样想是对的吗?如果不对,请给我建议一个更好的解决方案。

谢谢!

更新

var geodata = "[["M. L. Quezon Street<br/>Mandaue City, Philippines", [10.351381999999999, 123.923535]], ["Talamban<br/>Cebu City, Philippines", [10.353527, 123.91352500000001]]]"; 

我觉得这个 JSON 没有被转义?我该如何在 JSON 字符串中转义特殊字符呢?我总是遇到换行错误。

在 PHP 中,我会用 json_encode() 来解决这个问题。就像这篇文章中提到的:将 PHP 字符串传递给 JavaScript 变量(并转义换行符),但是在 Python/Django 中我该怎么做呢?

5 个回答

12

如果你不在乎像IE7这样的老旧浏览器,你可以简单地写:

var geodata = JSON.parse("{{geodata|escapejs}}");

这样就不需要额外的库了。你可以查看一下这个链接 http://caniuse.com/#feat=json,里面有支持JSON.parse()的浏览器版本信息。

我觉得@adamk的高票回答可能有XSS安全问题。如果JSON里包含了 "</script>",浏览器会把它当作 <script> 标签的结束符。所以用@wenbert的代码或者我自己的代码会更好。

我想直接在答案下评论,但我的声望不够,不能这样做 :)

28

好的,我解决了我的问题,想要回答我自己的问题。我觉得这样对其他用户会更有帮助。

首先,去这里下载文件:http://www.JSON.org/json_parse.js

var geodata = json_parse("{{geodata|escapejs}}");

我使用了 escapejs:http://docs.djangoproject.com/en/dev/ref/templates/builtins/#escapejs

补充一下:感谢 Ignacio Vazquez-Abrams。他在 #python Freenode 帮助了我。我应该在发这个帖子的时候提到他。我不知道他也在 Stackoverflow。

70

你可以使用内置的 json 模块:

>>> import json
>>> geodata = [ ( "Here", (1003,3004) ), ("There", (1.2,1.3)) ]
>>> json.dumps(geodata)
'[["Here", [1003, 3004]], ["There", [1.2, 1.3]]]'

然后你可以很简单地把得到的字符串放到一个javascript脚本里:

<script type='text/javascript'>
var geodata = {{ geodata|safe }};
</script>

撰写回答