Если вы хотите написать небольшой 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 %}