2012-08-14 61 views
12

据我所知,没有办法测试一个对象是否是Jinja2中的一个List实例。首先,这是否正确,其次,是否有人在Jinja2中实现了自定义测试/扩展?任何帮助都会很棒。在Jinja2中测试列表

回答

9

你可以在jinja2中轻松完成自定义过滤器。

首先创建你的测试方法:

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

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

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

神社有很多内置的测试。您可能正在寻找iterable

{% if var is iterable %} 
+5

一个字符串也是可迭代的,所以这将不起作用 – pors 2016-08-11 14:49:37

+0

我也注意到'sequence'测试,但它也认为字符串是一个序列。 – 2017-06-15 13:57:19

18

我做了这样的 {% if var is iterable and var is not string %}

+1

在我的情况下'{%if var is string%}'完美地工作;谢谢。 – berto 2017-08-07 13:22:38

-1

在我的设置,我想一个值是字符串或即将进入神社模板字符串列表。所以我真正关心的不是字符串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(', ') }}

+0

它看起来像这个答案收到downvote出于某种原因。它对我来说工作正常,但如果有什么不适合你,请随时添加评论。 – 2017-08-22 18:04:37