Подтвердить что ты не робот

Как я могу разбить цикл for в jinja2?

Как я могу вырваться из цикла for в jinja2?

мой код выглядит так:

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

У меня есть более одной страницы, которая имеет это условие, и я хочу закончить цикл, как только условие будет выполнено.

4b9b3361

Ответ 1

Вы не можете использовать break, вместо этого вы будете фильтровать. Из документа Jinja2 на {% for %}:

В отличие от Python его невозможно разбить или продолжить в цикле. Тем не менее, вы можете фильтровать последовательность во время итерации, которая позволяет пропустить элементы. В следующем примере пропускаются все скрытые пользователи:

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

В вашем случае, однако, вам кажется, что нужен только первый элемент; просто отфильтруйте и выберите первый:

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

Это фильтрует список, используя фильтр selectattr(), результат которого передается first filter.

Фильтр selectattr() создает итератор, поэтому использование first здесь будет выполнять только итерацию по входу до первого совпадающего элемента, а не дальше.

Ответ 2

Разрыв и Продолжить можно добавить в Jinja2 с помощью расширения элементов управления циклом. Jinja Loop Control Просто добавьте расширение в среду jinja.

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

согласно комментарий sb32134

Ответ 3

Но если вам по какой-то причине нужен цикл, вы можете проверить индекс цикла внутри цикла for-loop, используя "loop.first":

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