Насколько я вижу, нет способа проверить, является ли объект экземпляром List в Jinja2. Во-первых, это правильно, и, во-вторых, кто-нибудь реализовал пользовательский тест/расширение в Jinja2? Любая помощь будет отличной.
Тестирование списка в Jinja2
Ответ 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(', ') }}
.