如何在jinja2中打破for循环?

Tax*_*ool 30 python for-loop jinja2

如何突破jinja2中的for循环?

我的代码是这样的:

<a href="#">
{% for page in pages if page.tags['foo'] == bar %}
{{page.title}}
{% break %}
{% endfor %}
</a>
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 43

您不能使用break,而是过滤.从Jinja2 文档{% for %}:

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

{% for user in users if not user.hidden %}
    <li>{{ user.username|e }}</li>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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

{{ (pages|selectattr('tags.foo', bar)|first).title }}
Run Code Online (Sandbox Code Playgroud)

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

selectattr()滤波器产生一个迭代,因此,使用first此处将只对输入迭代直到第一匹配元件,并没有进一步.

  • @Canuck:另一方面,`| first`过滤器将确保不会迭代整个数据集; `selectattr()`使用迭代,它不会产生一个全新的列表,因此`first`只需要迭代*直到第一个匹配元素*. (2认同)

one*_*klc 12

可以使用循环控件扩展将BreakContinue添加到Jinja2. Jinja Loop Control 只需将扩展添加到jinja环境中.

jinja_env = Environment(extensions=['jinja2.ext.loopcontrols'])
Run Code Online (Sandbox Code Playgroud)

根据sb32134评论


Nik*_*kiy 7

但是,如果由于某种原因需要循环,则可以使用“ loop.first”检查for循环块中的循环索引:

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