如何突破jinja2中的for循环?
我的代码是这样的:
<a href="#">
{% for page in pages if page.tags['foo'] == bar %}
{{page.title}}
{% break %}
{% endfor %}
</a>
我有多个具有此条件的页面,并且我想在条件满足后结束循环。
答案 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'])
答案 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 %}