使用Flask中的Jinja2获取嵌套字典项

17

对于这个带有 Flask 控制器的字典

projects = {
        'life-calc':{'url':'life-calc',
                    'title': 'Life Calculator'},
        'text-game':{'url':'text-game',
                    'title':'Text Adventure'},
        'fill-it-up':{'url':'fill-it-up',
                    'title':'Fill It Up'},
        'rock-paper-scissors':{'url':'rock-paper-scissors',
                    'title':'Rock, Paper, Scissors'},
        'bubble-popper':{'url':'bubble-popper',
                    'title':'Bubble Popper'}
            }


@app.route('/')
def index():
    return render_template("index.html",
                            projects = projects)

以及相应的模板

    <h1>
        List of My Projects
    </h1>

    <ol>
        <li>
            <a href = "life-calc">Life Calculator</a>
        </li>
        <li>
            <a href = "text-game">Adventure Game</a>
        </li>
        <li>
            <a href = "fill-it-up">Fill It Up</a>
        </li>
        <li>
            <a href = "rock-paper-scissors">Rock Paper Scissors</a>
        </li>
        <li>
            <a href = "bubble-popper">Bubble Popper</a>
        </li>
    </ol>
    <p>test section below</p>
    <ol>
        {% for project in projects %}
        <li><a href = "{{ project['url'] }}">{{ project['title'] }}</a> </li>
        {% endfor %}
    </ol>

{% endblock %}
我该如何访问字典中的项目,以打印出类似于上面测试HTML中我的项目列表?我在Rendering a python dict in Jinja2 / Werkzeug中得到了帮助解决了我的问题。模板块应该是:
{% for key, value in projects.iteritems() %}
<li><a href={{value['url']}}>{{value['title']}}</a></li>
{% endfor %}

但我仍然好奇如何访问更深层次的字典,以及是否这是创建简单菜单的最聪明方法。

2个回答

25

我想你想知道如何在模板中访问嵌套字典

如果我理解了你的问题

一般来说,这是访问字典中的嵌套字典项的方法

如果可迭代对象进一步嵌套,只需增加forloop深度级别,无论是列表还是字典。

这里我以自己的方式给出一个通用示例,以便您理解。

数据:

parent_dict = {1: {'A':'val1','B':'val2'}, 2:{'C':'val3','D':'val4'}}

jinja2中的迭代:

{% for key,parent_dict_item in parent_dict.items() %}
   {% for key2, nested_value in parent_dict_item.items() %}
      <li><a href = "{{ nested_value }}">{{ nested_value }}</a> </li>
   {% endfor %}
{% endfor %}

回答:


<li><a href="val1">val1</a> </li>
<li><a href="val2">val2</a> </li>
<li><a href="val3">val3</a> </li>
<li><a href="val4">val4</a> </li>

1
我知道这个帖子已经发布了将近两年,但是是否有一种方法可以使用这种方法对嵌套字典进行排序?我之前一直在使用类似{% for k, v in parent_dict|dictsort %}的东西,但是使用这种方法我无法使用dictsort。有什么想法吗? - DJGrandpaJ
2
你可以编写模板过滤器来实现它。在Django模板、jinja2等中都可以使用。参考 - Nava
谢谢,我会看一下的! :) - DJGrandpaJ
1
使用 .iteritems() 进行迭代比使用 .items() 更好。 - Yogesh Kamat

20

你可以使用键来引用字典中的项,而不是在循环中展开键和值:

{% for project in projects %}
  <li><a href = "{{ projects[project].url }}">{{ projects[project].title }}</a> </li>
{% endfor %}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接