Python 在Django/Jinja2模板中将dict对象转换为字符串
如果您使用Django或Jinja2,您可能以前遇到过这个问题。 我有一个JSON字符串,如下所示:Python 在Django/Jinja2模板中将dict对象转换为字符串,python,django,jinja2,Python,Django,Jinja2,如果您使用Django或Jinja2,您可能以前遇到过这个问题。 我有一个JSON字符串,如下所示: { "data":{ "name":"parent", "children":[ { "name":"child_a", "fav_colors":[ "blue", "red" ] }, { "name":"child_b",
{
"data":{
"name":"parent",
"children":[
{
"name":"child_a",
"fav_colors":[
"blue",
"red"
]
},
{
"name":"child_b",
"fav_colors":[
"yellow",
"pink"
]
}
]
}
}
<select>
{% for p in data recursive %}
<option disabled>{{ p.name }}</option>
{% for c in p.children %}
<option value="{{ c.fav_colors|safe }}">{{ c.name }}</option>
{% endfor %}
{% endfor %}
</select>
现在,我想将其传递给我的Jinja2模板:
j = json.loads('<the above json here>')
self.render_response('my_template.html', j)
j=json.load(“”)
self.render\u响应('my\u template.html',j)
…并按如下方式进行迭代:
{
"data":{
"name":"parent",
"children":[
{
"name":"child_a",
"fav_colors":[
"blue",
"red"
]
},
{
"name":"child_b",
"fav_colors":[
"yellow",
"pink"
]
}
]
}
}
<select>
{% for p in data recursive %}
<option disabled>{{ p.name }}</option>
{% for c in p.children %}
<option value="{{ c.fav_colors|safe }}">{{ c.name }}</option>
{% endfor %}
{% endfor %}
</select>
{p在数据递归%中的百分比}
{{p.name}}
{p.children%中c的%s}
{{c.name}}
{%endfor%}
{%endfor%}
这就是我遇到的问题所在:除了Jinja2输出c.fav_颜色的unicode编码值外,其他一切都可以工作。我需要c.fav_colors作为有效的javascript数组,以便可以从javascript访问它。如何让Jinja将该值打印为ascii文本,例如:
['blue','red']
而不是[u'blue',u'red']
?您需要将fav_colors
列表转换回JSON。可能最简单的方法是使用快速模板过滤器:
@register.filter
def to_json(value):
return mark_safe(simplejson.dumps(value))
所以现在你可以做了
<option value="{{ c.fav_colors|to_json }}">
是否没有结束标记?另外,为什么不[{%forc%}“item”{%ifnotforloop.last%}、{%endif%}{%endfor%}呢?这就是模板的用途:将python值转换为视图所需的任何内容。更新了该选项标记。我在这里使用的循环语法是为了清晰。我只是想展示一下这个问题:如何将c.fav_颜色输出为有效的javascript兼容数组:['blue','red']
duh!当然但我实际上是在webapp2中使用Jinja2,所以现在我需要了解如何为Jinja执行'@register.filter'部分。谢谢。我不敢相信我没有想到这一点:-)如果有人想知道我是如何在webapp2中做到这一点的:只需在webapp2文档中查找Jinja2,然后在BaseHandler类中执行类似操作:j=Jinja2.get\u Jinja2(app=self.app)j.environment.filters.update({'to_json':to_json})
我必须使用转义(mark\u safe(simplejson.dumps(value)))为了让它工作。我使用它作为HTML中li元素的数据属性的一部分,如果不使用escape,dynatree将无法正确解析它。