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

Тестирование списка в Jinja2

Насколько я вижу, нет способа проверить, является ли объект экземпляром List в Jinja2. Во-первых, это правильно, и, во-вторых, кто-нибудь реализовал пользовательский тест/расширение в Jinja2? Любая помощь будет отличной.

4b9b3361

Ответ 1

Вы можете легко сделать это с помощью специального фильтра в jinja2.

Сначала создайте тестовый метод:

def is_list(value):
    return isinstance(value, list)

И добавьте его как пользовательский фильтр:

j = jinja2.Jinja2(app)
j.environment.filters.update({
        'is_list': is_list,
})

Ответ 2

Я сделал это так {% if var is iterable and var is not string %}

Ответ 3

У Jinja есть много встроенных тестов. Вероятно, вы ищете iterable.

{% if var is iterable %}

Ответ 4

В моей настройке я хотел бы, чтобы значение представляло собой строку или список строк, входящих в шаблон Jinja. Так что на самом деле то, о чем я заботился, это не строковый список vs, а отдельный элемент и несколько элементов. Этот ответ может помочь, если ваш пример использования схож.

Так как нет встроенного теста для "is list?" который также отклоняет строки, я заимствовал шаблон из дизайна API и обернул отдельные объекты в списке на стороне Python, а затем проверил длину списка на стороне Jinja.

Python:

context = { ... }

# ex. value = 'a', or ['a', 'b']
if not isinstance(value, list):
    value = [value]

context['foo'] = value

Дзиндзя:

{% if foo|length == 1 %}
  single-item list
{% elif foo|length > 1 %}
  multi-item list
{% endif %}

И если все, что вы хотите сделать, это добавить разделитель элементов для отображения, вы можете пропустить явную проверку длины и просто {{ value|join(', ') }}.