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

发布于 2024-12-24 16:41:17 字数 1062 浏览 0 评论 0原文

如果您使用 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 输出 unicode 编码值之外,一切正常.fav_colors。我需要 c.fav_colors 作为有效的 javascript 数组,以便我可以从 javascript 访问它。如何让 Jinja 将该值打印为 ascii 文本,例如: ['blue','red'] 而不是 [u'blue', u'red']

If you use Django or Jinja2, you've probably ran into this problem before.
I have a JSON string that looks like this:

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

Now I want to pass this to my Jinja2 template:

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

...and iterate it like this:

<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>

This is where I'm having the problem: everything works except Jinja2 outputs unicode encoded values for c.fav_colors. I need c.fav_colors as a valid javascript array so that I can access it from javascript. How can I get Jinja to print that value as ascii text like: ['blue','red'] instead of [u'blue', u'red'] ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

忘羡 2024-12-31 16:41:17

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

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

所以现在你可以这样做

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

You need to convert the fav_colors list back to JSON. Probably the easiest way to do this would be with a quick template filter:

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

So now you could do

<option value="{{ c.fav_colors|to_json }}">
尽揽少女心 2024-12-31 16:41:17

Jinja2 现在内置了 tojson() 过滤器
https://jinja.palletsprojects.com/en/3.1 .x/templates/#jinja-filters.tojson

{{ my_dict|tojson }}

可能不完全是OP(或其他读者)所需要的,但在这里值得一提。

Jinja2 now has a tojson() filter built-in
https://jinja.palletsprojects.com/en/3.1.x/templates/#jinja-filters.tojson

{{ my_dict|tojson }}

Might not be exactly what OP (or another reader) needs, but worth mentioning here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文