在Jinja中有条件地连接字符串列表
我有一个这样的列表:
users = ['tom', 'dick', 'harry']
在一个 Jinja
模板中,我想打印出所有用户的列表,但要排除 tom
。我不能在传递给模板之前修改这个变量。
我试过用列表推导式和 Jinja 的 reject
过滤器,但都没有成功,比如:
{{ [name for name in users if name != 'tom'] | join(', ') }}
这会导致语法错误。
我该如何有条件地连接列表项呢?
4 个回答
0
如果有人想要拒绝多个值,可以试着用'in'
后面跟一个列表,而不是使用'equalto'或'sameas':
>>> import jinja2
>>> template = jinja2.Template("{{ items|reject('in', ['a','b'])|join(',') }}")
>>> template.render(users=['a', 'b', 'c'])
u'c'
13
这个方法应该可以用,因为列表推导式并不是直接支持的。当然,使用合适的过滤器会更好。
{% for name in users if name != 'tom'%}
{{name}}
{% if not loop.last %}
{{','}}
{% endif %}
{% endfor %}
24
>>> import jinja2
>>> template = jinja2.Template("{{ users|reject('sameas', 'tom')|join(',') }}")
>>> template.render(users=['tom', 'dick', 'harry'])
u'dick,harry'
更新
如果你使用的是 Jinja 2.8 及以上版本,建议使用 equalto
,而不是 sameas
,正如 @Dougal 所评论的那样;sameas
是用 Python 的 is
来测试,而 equalto
是用 ==
来测试。