据我所知,没有办法测试一个对象是否是List
Jinja2 中的一个实例。
这是正确的吗?有人在 Jinja2 中实现了自定义测试/扩展吗?
我是这样做的:
{% if var is iterable and (var is not string and var is not mapping) %}
您可以在此处找到所有 jinja 测试的列表。
您可以使用 jinja2 中的自定义过滤器轻松完成此操作。
首先创建你的测试方法:
def is_list(value):
return isinstance(value, list)
并将其添加为自定义过滤器:
j = jinja2.Jinja2(app)
j.environment.filters.update({
'is_list': is_list,
})
在我的设置中,我希望一个值是进入 Jinja 模板的字符串或字符串列表。所以我真正关心的不是字符串与列表,而是单个项目与多个项目。如果您的用例相似,此答案可能会有所帮助。
由于没有针对“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(', ') }}
.
可迭代返回 True 也在 dict 上。试试这个:
{% if var.__class__.__name__ == 'list' %}
Jinja 有许多内置测试。您可能正在寻找iterable。
{% if var is iterable %}