Использование "если есть ():" в Jinja2? - PullRequest
0 голосов
/ 07 февраля 2019

В Jinja2 я ищу способ проверить, имеет ли значение хотя бы одна из списка переменных.В основном на python я бы сделал:

if any([item['genre'], item['type'], item['color']]):

Однако в Jinja следующее недействительно:

{% if any([item['genre'], item['type'], item['color']]) %}
# some part of the Jinja template
{% endif %}

Есть ли способ иметь такую ​​же проверку "any ()"в Jinja2?

Для фона: полный кусок кода, который я сейчас пытаюсь добавить (но не действительный):

{% if any([item['genre'], item['type'], item['color']]) %}
<ItemProperties>
    <ItemProperty key="genre">{{ item['genre'] }}</ItemProperty>
    <ItemProperty key="type">{{ item['type'] }}</ItemProperty>
    <ItemProperty key="color">{{ item['color'] }}</ItemProperty>
</ItemProperties>
{% endif %}

1 Ответ

0 голосов
/ 07 февраля 2019

В шаблонах Jinja2 нет прямого эквивалента функции any().

Для 3 жестко закодированных элементов я бы просто использовал булеву логику or:

{% if item['genre'] or item['type'] or item['color'] %}

В противном случае вы можете использовать select() фильтр без аргумента (за которым следует first() для принудительного выполнения итерации).Поскольку select() сам является генератором, использование first() на select() делает это короткое замыкание таким образом, как any() будет:

{% if (item['genre'], item['type'], item['color'])|select|first %}

Без аргумента, select() возвращает любые объекты извходная последовательность, которая имеет значение true, и first() гарантирует, что она повторяет не больше, чем нужно для поиска одного такого элемента.

Последний вариант - зарегистрировать пользовательский фильтр , чтобы просто добавить any()самому Джинджа;Я также добавил бы all() в этом случае.Вы можете зарегистрировать обе функции напрямую , поскольку ни одна из них не принимает опций:

environment.filters['any'] = any
environment.filters['all'] = all

, после чего вы можете использовать

{% if (item['genre'], item['type'], item['color'])|any %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...