Как удалить последний элемент во вложенном цикле jinja? - PullRequest
0 голосов
/ 25 октября 2018

С помощью одного цикла легко написать {% if not loop.last %}JOIN{% endif %} для удаления JOIN из последней итерации цикла.

С помощью вложенного цикла мы можем получить доступ к внешнему циклу , что позволяет нам проверить, находимся ли мы в последних итерациях обоих циклов.

Тем не менее, у меня есть 3-уровневая вложенность, для которой это решение довольно многословно:

{% set loop1 = loop %}
...
{% set loop2 = loop %}
...
{% if not loop1.last and loop2.last and loop.last %}JOIN{% endif %}

Есть ли лучший способ пропустить последнюю итерацию вложенного цикла?

1 Ответ

0 голосов
/ 25 октября 2018

Если вы хотите написать небольшой Python, вы можете сделать его чистым, используя специальный фильтр (этот код должен быть запущен до загрузки любых шаблонов) или просто добавив all в свою глобальную среду Jinja2:

from jinja2 import Environment, PackageLoader, select_autoescape, last

env = Environment(
    loader = PackageLoader('yourapplication', 'templates'),
    autoescape = select_autoescape(['html', 'xml'])
)

def between(token, *args):
    return token if all(x.last for x in args) else ''

env.globals['between'] = between
env.globals['all'] = all

Теперь вы можете сделать:

{{ 'JOIN'|between(loop1, loop2, loop) }}
# or
{% if not all([loop1, loop2, loop]|map('last')) %}JOIN{% endif %}

В противном случае вы можете реализовать макрос Jinja2 , который использует специальную переменную varargs для доступа ко всем безымяннымаргументы, передаваемые макросу в виде списка Jinja2.

{% macro between(token) -%}
    {% if not varargs|map('last')|select|length == varargs|length -%}
        {{ token }}
    {%- endif %}
{%- endmacro %}

Обратите внимание, что использование - в примере указывает, что пробел до {%- и после -%} будет удален при расширении макроса.Теперь использование:

{{ between(token = JOIN, loop1, loop2, loop) }}

Вы можете сохранить ассортимент макросов утилит Jinja2 в файле и включить его в начало ваших шаблонов, например: {% include 'util.jinja2' as 'util' %}, и использование станет:

{{ util.between(token = JOIN, loop1, loop2, loop) }}

Альтернативой созданию коллекции макросов и ее использованию в шаблонах является включение ее в свои шаблоны.Вот идея для одного лайнера, чтобы сделать трюк:

{% set loops = [loop1, loop2, loop] %}
{% if not loops|map('last')|select|length == loops|length %}JOIN{% endif %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...