如何在jinja2中打破for循环?

时间:2014-03-03 15:10:53

标签: python for-loop jinja2

如何突破jinja2中的for循环?

我的代码是这样的:

<a href="#">
{% for page in pages if page.tags['foo'] == bar %}
{{page.title}}
{% break %}
{% endfor %}
</a>

我有多个具有此条件的页面,并且我想在条件满足后结束循环。

3 个答案:

答案 0 :(得分:40)

您无法使用break,而是过滤。来自Jinja2 documentation on {% for %}

  

与Python不同,它不可能在循环中中断或继续。但是,您可以在迭代期间过滤序列,以便跳过项目。以下示例将跳过所有隐藏的用户:

{% for user in users if not user.hidden %}
    <li>{{ user.username|e }}</li>
{% endfor %}

但是,在您的情况下,您似乎只需要第一个元素;只过滤并选择第一个:

{{ (pages|selectattr('tags.foo', bar)|first).title }}

这会使用selectattr() filter过滤列表,其结果将传递给first filter

selectattr()过滤器生成一个迭代器,因此在这里使用first只会迭代输入到第一个匹配元素,而不再进一步。

答案 1 :(得分:8)

可以使用循环控件扩展将

中断继续添加到Jinja2。 Jinja Loop Control 只需将扩展名添加到jinja环境中即可。

jinja_env = Environment(extensions=['jinja2.ext.loopcontrols'])

根据sb32134 comment

答案 2 :(得分:5)

但是如果你出于某种原因需要一个循环,你可以使用“loop.first”检查for循环块内的循环索引:

{% for dict in list_of_dict %} 
    {% for key, value in dict.items() if loop.first %}
      <th>{{ key }}</th>
    {% endfor %} 
{% endfor %}