在Django/Jinja2模板中将dict对象转换为字符串

ofk*_*fko 6 python django jinja2

如果你使用Django或Jinja2,你可能以前遇到过这个问题.我有一个JSON字符串,如下所示:

{
  "data":{
    "name":"parent",
    "children":[
      {
        "name":"child_a",
        "fav_colors":[
          "blue",
          "red"
        ]
      },
      {
        "name":"child_b",
        "fav_colors":[
          "yellow",
          "pink"
        ]
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我想将它传递给我的Jinja2模板:

j = json.loads('<the above json here>')
self.render_response('my_template.html', j)
Run Code Online (Sandbox Code Playgroud)

...并像这样迭代:

<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>
Run Code Online (Sandbox Code Playgroud)

这就是我遇到问题的地方:除了Jinja2输出c.fav_colors的unicode编码值之外,一切正常.我需要c.fav_colors作为有效的javascript数组,以便我可以从javascript访问它.我怎样才能让Jinja将该值打印为ascii文本,['blue','red']而不是[u'blue', u'red']

Dan*_*man 13

您需要将fav_colors列表转换回JSON.可能最简单的方法是使用快速模板过滤器:

@register.filter
def to_json(value):
    return mark_safe(simplejson.dumps(value))
Run Code Online (Sandbox Code Playgroud)

所以现在你可以做到

<option value="{{ c.fav_colors|to_json }}">
Run Code Online (Sandbox Code Playgroud)

  • 呸!当然。但我实际上将 Jinja2 与 webapp2 一起使用,所以现在我需要找出如何为 Jinja 执行“@register.filter”部分。 (2认同)