在Django中将模板渲染为json的转义字符串

时间:2013-06-07 22:43:30

标签: python django django-templates escaping

这更像是一个普通的python问题,但在Django的上下文中它变得有点复杂。

我有一个模板,像这样,简化:

<span class="unit">miles</span>

我正在用jquery和ajax替换元素:

$.getJSON('/getunit/', function(data){
   $('#unitHolder').html(data.unit_html);
});

这是一个视图函数来检索json数据(比这个模板更多的数据)。所以我想把它作为json服务,而不仅仅是一个字符串。所以,相关代码是这样的:

    ...
    context = { 'qs' : queryset }
    data['unit'] = render_to_string('map/unit.html', context)
    data = str(data).replace('\'','"') #json wants double quotes
return HttpResponse(data, mimetype="application/json")

这适用于我们所有其他数据,但不适用于模板,因为它有双引号,不会被转义。我的问题是,如何在python中转义字符串以json格式使用?请注意,render_to_string()以unicode呈现字符串,因此u"<span>...</span>"

我试过

import json
data['unit'] = json.dumps(render_to_string('map/unit.html', context))

但这给了我"unit": ""<span class=\\"unit\\">miles</span>""

此外:

data['unit'] = str(render_to_string('map/unit.html', context)).replace('"','\"')

data['unit'] = str(render_to_string('map/unit.html', context)).replace('"','\\"')

但是两个都没有正确地脱离双引号。

1 个答案:

答案 0 :(得分:2)

在我遇到这个问题之前,我没有尝试json.dumps。以前我只是将python词典转换为字符串,然后用双引号替换单引号。对于我们传递给客户端的大多数数据,它呈现了正确的JSON格式。既然我已经在这个问题中尝试了json.dumps,我意识到我不需要使用strreplace转换任何字典。我可以按如下方式渲染脚本:

    ...
    context = { 'qs' : queryset }
    data['unit'] = render_to_string('map/unit.html', context)
    import json # I'll import this earlier
    data = json.dumps(data)
return HttpResponse(data, mimetype="application/json")

这适用于我传递给JSON格式的所有数据,因此效果非常好,这就是我应该一直这样做的。