在Jinja2/Werkzeug中渲染python dict

use*_*288 23 python werkzeug jinja2

我正在玩一个url shortener(基于Werkzeug的Shortly演示应用程序).

我有这样的字典 -

    ('1', {'target': 'http://10.58.48.103:5000/', 'clicks': '1'})
    ('3', {'target': 'http://slash.org', 'clicks': '4'})
    ('2', {'target': 'http://10.58.48.58:5000/', 'clicks': '1'})
    ('5', {'target': 'http://de.com/a', 'clicks': '0'})
Run Code Online (Sandbox Code Playgroud)

在url_list中返回并由render_template使用

def on_list_urls(self, request):
    url_list = self.get_urls()
    return self.render_template('list_urls.html',
        url_list = url_list
    )
Run Code Online (Sandbox Code Playgroud)

模板list_urls非常简单 -

    {% extends "layout.html" %}
    {% block title %}List URLs{% endblock %}
    {% block body %}
      <h2>List URLs</h2>
      <ul id="items">
      {% for item in url_list %}
        <li>{{ item }}</li>
      {% endfor %}
      </ul>

    {% endblock %}
Run Code Online (Sandbox Code Playgroud)

事情是,我似乎无法访问dict中的项目.

这条线

<li>{{ item }}</li>
Run Code Online (Sandbox Code Playgroud)

是我关注的焦点.如上所述,我得到了dict中的键列表.

<li>{{ item["target"] }}</li>
Run Code Online (Sandbox Code Playgroud)

没有回报.文档中的{{user.url}}"> {{user.username}}类型内容似乎都不起作用.

想法好吗?新手 - 要温柔.谢谢.

更新

谢谢你的回复.

Ewan的回答有效,但使用了一系列的词汇.我想传递一个dict并渲染它(因为我想要一个非整数的项目索引).Jinja那样做吗?

另外 - 我错误地表示了url_list.它更像是这样的 -

{'a': {'target': 'http://testing.com/test', 'clicks': '0'}, 
'1': {'target': 'http://10.58.48.103:5000/', 'clicks': '1'}, 
'3': {'target': 'http://slash.org', 'clicks': '4'}, 
'2': {'target': 'http://10.58.48.58:5000/', 'clicks': '1'}}
Run Code Online (Sandbox Code Playgroud)

进一步的实验 - 传递一个dict会产生一个关于列表对象的错误.

   {% for key in url_list.iteritems() %}

    UndefinedError: 'list object' has no attribute 'iteritems'
Run Code Online (Sandbox Code Playgroud)

再次感谢.

仍然感到困惑的是为什么它认为我正在通过一个列表,但现在让它工作.

{% for key, value in url_list.iteritems() %}
    <li>{{ key }} - {{ value["target"] }} - {{ value["clicks"] }}</li>
Run Code Online (Sandbox Code Playgroud)

打印出一切.非常感谢.

Ewa*_*wan 29

url_list应该看起来像这样:

url_list = [{'target': 'http://10.58.48.103:5000/', 'clicks': '1'}, 
            {'target': 'http://slash.org', 'clicks': '4'},
            {'target': 'http://10.58.48.58:5000/', 'clicks': '1'},
            {'target': 'http://de.com/a', 'clicks': '0'}]
Run Code Online (Sandbox Code Playgroud)

然后使用:

<li>{{ item["target"] }}</li> 
Run Code Online (Sandbox Code Playgroud)

在您的模板中将工作.

编辑1:

你的模板认为你正在传递一个列表,所以你确定你传递的是原始字典而不是我的上面的列表吗?

您还需要访问字典中的a key和a value(当您传递字典而不是列表时):

Python 2.7

{% for key, value in url_list.iteritems() %}
    <li>{{ value["target"] }}</li> 
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

Python 3

{% for key, value in url_list.items() %}
    <li>{{ value["target"] }}</li> 
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

  • 在Python 3中,你的`url_list.iteritems`将是`url_list.items()`(你需要括号来调用它). (4认同)