Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django/Jinja2模板中将dict对象转换为字符串_Python_Django_Jinja2 - Fatal编程技术网

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

Python 在Django/Jinja2模板中将dict对象转换为字符串,python,django,jinja2,Python,Django,Jinja2,如果您使用Django或Jinja2,您可能以前遇到过这个问题。 我有一个JSON字符串,如下所示: { "data":{ "name":"parent", "children":[ { "name":"child_a", "fav_colors":[ "blue", "red" ] }, { "name":"child_b",

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

{
  "data":{
    "name":"parent",
    "children":[
      {
        "name":"child_a",
        "fav_colors":[
          "blue",
          "red"
        ]
      },
      {
        "name":"child_b",
        "fav_colors":[
          "yellow",
          "pink"
        ]
      }
    ]
  }
}
<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模板:

j = json.loads('<the above json here>')
self.render_response('my_template.html', j)
j=json.load(“”)
self.render\u响应('my\u template.html',j)
…并按如下方式进行迭代:

{
  "data":{
    "name":"parent",
    "children":[
      {
        "name":"child_a",
        "fav_colors":[
          "blue",
          "red"
        ]
      },
      {
        "name":"child_b",
        "fav_colors":[
          "yellow",
          "pink"
        ]
      }
    ]
  }
}
<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>

{p在数据递归%中的百分比}
{{p.name}}
{p.children%中c的%s}
{{c.name}}
{%endfor%}
{%endfor%}

这就是我遇到的问题所在:除了Jinja2输出c.fav_颜色的unicode编码值外,其他一切都可以工作。我需要c.fav_colors作为有效的javascript数组,以便可以从javascript访问它。如何让Jinja将该值打印为ascii文本,例如:
['blue','red']
而不是
[u'blue',u'red']

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

@register.filter
def to_json(value):
    return mark_safe(simplejson.dumps(value))
所以现在你可以做了

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


是否没有结束标记?另外,为什么不[{%forc%}“item”{%ifnotforloop.last%}、{%endif%}{%endfor%}呢?这就是模板的用途:将python值转换为视图所需的任何内容。更新了该选项标记。我在这里使用的循环语法是为了清晰。我只是想展示一下这个问题:如何将c.fav_颜色输出为有效的javascript兼容数组:
['blue','red']
duh!当然但我实际上是在webapp2中使用Jinja2,所以现在我需要了解如何为Jinja执行'@register.filter'部分。谢谢。我不敢相信我没有想到这一点:-)如果有人想知道我是如何在webapp2中做到这一点的:只需在webapp2文档中查找Jinja2,然后在BaseHandler类中执行类似操作:
j=Jinja2.get\u Jinja2(app=self.app)j.environment.filters.update({'to_json':to_json})
我必须使用转义(mark\u safe(simplejson.dumps(value)))为了让它工作。我使用它作为HTML中li元素的数据属性的一部分,如果不使用escape,dynatree将无法正确解析它。