35

据我所知,没有办法测试一个对象是否是ListJinja2 中的一个实例。

这是正确的吗?有人在 Jinja2 中实现了自定义测试/扩展吗?

4

5 回答 5

87

我是这样做的:

{% if var is iterable and (var is not string and var is not mapping) %}

您可以在此处找到所有 jinja 测试的列表。

于 2016-09-12T15:26:11.570 回答
22

您可以使用 jinja2 中的自定义过滤器轻松完成此操作。

首先创建你的测试方法:

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

并将其添加为自定义过滤器:

j = jinja2.Jinja2(app)
j.environment.filters.update({
        'is_list': is_list,
})
于 2012-08-14T07:24:24.360 回答
3

在我的设置中,我希望一个值是进入 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(', ') }}.

于 2017-06-15T14:10:06.497 回答
2

可迭代返回 True 也在 dict 上。试试这个:

{% if var.__class__.__name__ == 'list' %}
于 2021-10-22T08:28:18.477 回答
-1

Jinja 有许多内置测试。您可能正在寻找iterable

{% if var is iterable %}
于 2016-05-12T18:30:23.293 回答