Jinja2 проверяет, существует ли значение в списке словарей - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь проверить, существует ли значение в списке со словарями. Я использую колбу 1.0.2. Смотрите пример ниже:

person_list_dict = [
    {
        "name": "John Doe",
        "email": "johndoe@mydomain.com",
        "rol": "admin"
    },
    {
        "name": "John Smith",
        "email": "johnsmith@mydomain.com",
        "rol": "user"
    }
]

Я нашел два способа решения этой проблемы, вы можете сказать мне, что лучше?

Первый вариант: встроенный шаблонный фильтр jinja2 "map"

<code><pre>{% if "admin" in person_list_dict|map(attribute="rol") %}YES{% else %}NOPE{% endif %}
# верните ДА (Джон Доу) и НОП (Джон Смит)

Второй вариант: фильтр шаблона колбы

Код колбы:

@app.template_filter("is_in_list_dict")
def is_any(search="", list_dict=None, dict_key=""):
    if any(search in element[dict_key] for element in list_dict):
        return True
    return False

Код шаблона:

<code><pre>{% if "admin"|is_in_list_dict(person_list_dict, "rol") %} YES {% else %} NOPE {% endif %}
# верните ДА (Джон Доу) и НОП (Джон Смит)

Спасибо: -).

1 Ответ

0 голосов
/ 07 сентября 2018

Если возможно, я бы переместил эту логику в часть скрипта на языке Python, прежде чем рендерить ее в Jinja. Потому что, как указано в документации Jinja : «Без сомнения, вы должны попытаться удалить как можно больше логики из шаблонов».

any([person['role'] == 'admin' for person in person_dict_list]) намного проще следовать с первого взгляда, чем другие 2 варианта.

Если это не вариант, я бы, вероятно, использовал бы первую встроенную функцию, потому что я думаю, что он менее подвержен ошибкам в крайних случаях как ваше собственное решение и примерно в 6 раз меньше кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...