【问题标题】:Converting dict object to string in Django/Jinja2 template在 Django/Jinja2 模板中将 dict 对象转换为字符串
【发布时间】:2012-01-04 13:04:12
【问题描述】:

如果您使用 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']

【问题讨论】:

  • 没有 结束标签?另外,为什么不 [{% for item in c %}"item"{% if not forloop.last %},{% endif %}{% endfor %}] ?毕竟,这就是模板的用途:将 python 值转换为视图所需的任何内容。
  • 更新了那个选项标签。我在这里使用的循环语法是为了清楚起见。我只是想展示这个问题:如何将 c.fav_colors 输出为有效的 javascript 兼容数组:['blue','red']

标签: python django jinja2


【解决方案1】:

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

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

所以现在你可以做

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

【讨论】:

  • 呃!当然。但我实际上将 Jinja2 与 webapp2 一起使用,所以现在我需要了解如何为 Jinja 执行“@register.filter”部分。
  • 谢谢。我不敢相信我没有想到这一点:-)
  • 如果有人想知道我是如何在 webapp2 中做到这一点的:只需在 webapp2 文档中查找 Jinja2,然后在 BaseHandler 类中执行类似的操作:j=jinja2.get_jinja2(app=self.app) j.environment.filters.update({'to_json': to_json})
  • 我必须使用 escape(mark_safe(simplejson.dumps(value))) 才能使其工作。我将它用作 HTML 中 li 元素的 data 属性的一部分,如果我不使用转义,dynatree 将无法正确解析它。
猜你喜欢
  • 2015-05-17
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 2022-11-11
  • 2011-06-17
  • 2021-07-23
相关资源
最近更新 更多