2012-01-04 66 views
6

如果您使用Django或Jinja2,您可能会遇到此问题。 我有一个JSON字符串,看起来像这样:将dict对象转换为Django/Jinja2模板中的字符串

{ 
    "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']

+1

没有关闭标签?另外,为什么不[{%for item in c%}“item”{%if not forloop.last%},{%endif%} {%endfor%}]?毕竟这是模板的用途:将python值转换为任何需要的视图。 – jpic 2012-01-04 13:10:53

+0

更新了该选项标签。我在这里使用的循环语法是为了清晰起见。我只是想展示这个问题:如何输出c.fav_colors作为有效的javascript兼容数组:'['blue','red']' – ofko 2012-01-04 13:17:24

回答

13

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

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

所以,现在你可以做

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

duh!当然。但我实际上使用Jinja2与webapp2,所以现在我需要找出如何为Jinja做'@ register.filter'部分。 – ofko 2012-01-04 13:48:48

+0

谢谢。我不敢相信我没有想到:-) – ofko 2012-01-04 14:21:57

+0

如果有人想知道我是如何在webapp2中做到这一点的:只需在webapp2文档中查找Jinja2,然后在BaseHandler类中执行如下操作:'j = jinja2.get_jinja2( app = self.app) j.environment.filters.update({'to_json':to_json})' – ofko 2012-01-04 14:41:16