在Jinja中有条件地连接字符串列表

19 投票
4 回答
23114 浏览
提问于 2025-04-18 08:36

我有一个这样的列表:

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'
1

另一种解决方案是使用“equalto”测试,而不是“sameas”。

可以使用reject过滤器,配合equalto测试:

>>> import jinja2
>>> template = jinja2.Template("{{ items|reject('equalto', 'aa')|join(',') }}")
>>> template.render(users=['aa', 'bb', 'cc'])
u'bb,cc'
13

这个方法应该可以用,因为列表推导式并不是直接支持的。当然,使用合适的过滤器会更好。

{% for name in users if name != 'tom'%}
    {{name}}
    {% if not loop.last %}
         {{','}}
    {% endif %}
{% endfor %}
24

使用 reject 过滤器配合 sameas 测试:

>>> 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 是用 == 来测试。

撰写回答