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

10 投票
2 回答
23650 浏览
提问于 2025-04-17 09:31

如果你在使用Django或者Jinja2的时候,可能遇到过这样的问题。我有一个看起来像这样的JSON字符串:

{
  "data":{
    "name":"parent",
    "children":[
      {
        "name":"child_a",
        "fav_colors":[
          "blue",
          "red"
        ]
      },
      {
        "name":"child_b",
        "fav_colors":[
          "yellow",
          "pink"
        ]
      }
    ]
  }
}

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

j = json.loads('<the above json here>')
self.render_response('my_template.html', j)

...然后像这样进行遍历:

<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输出的c.fav_colors是unicode编码的值。我需要c.fav_colors作为一个有效的JavaScript数组,这样我才能在JavaScript中访问它。我该怎么做才能让Jinja输出这个值为ASCII文本,比如:['blue','red'],而不是[u'blue', u'red']

2 个回答

0

Jinja2现在内置了一个叫做tojson()的过滤器,

https://jinja.palletsprojects.com/en/3.1.x/templates/#jinja-filters.tojson
{{ my_dict|tojson }}

这可能不是提问者(或者其他读者)所需要的内容,但在这里提一下还是有价值的。

17

你需要把 fav_colors 这个列表转换回 JSON 格式。最简单的方法可能就是用一个快速的模板过滤器:

@register.filter
def to_json(value):
    return mark_safe(simplejson.dumps(value))

这样你就可以这样做了:

<option value="{{ c.fav_colors|to_json }}">

撰写回答