如何在Jinja Python模板中输出逗号分隔列表?


179

如果我有一个userssay 列表["Sam", "Bob", "Joe"],我想做一些我可以在jinja模板文件中输出的内容:

{% for user in userlist %}
    <a href="/profile/{{ user }}/">{{ user }}</a>
    {% if !loop.last %}
        , 
    {% endif %}
{% endfor %}   

我想使输出模板为:

Sam, Bob, Joe

我尝试了上面的代码来检查它是否在循环的最后一次迭代中,如果没有,则不要插入逗号,但是它不起作用。我该怎么做呢?


jinja和Python一样,不用!作求反运算符。“ not”拼写为“ not”。
Wooble 2012年

Answers:


306

您希望if支票为:

{% if not loop.last %}
    ,
{% endif %}

请注意,您还可以使用If Expression来缩短代码:

{{ "," if not loop.last }}

2
这很棒,特别是在html循环的结尾
Sinux

7
只是,您可能需要根据设置将其设为if / else。更多信息。可以在这里找到:github.com/pallets/jinja/issues/710
Paul Calabro

1
还是某些情况{{ "," if not forloop.last }}
obotezat

5
我赞成添加其他评论。这对我{{ "," if not loop.last else "" }}
有用

197

您还可以使用内置的“ join”过滤器(http://jinja.pocoo.org/docs/templates/#join像这样:

{{ users|join(', ') }}

1
虽然这可以创建csv,但请参见上面的示例,但不能与周围的锚点一起使用。
triunenature

这种方法也不能很好地用于转义:['{{['a \“,'b'] | join(”','“)}}'']产生['a&#39;&#39; ,&#39; b”]
stewbasic 2015年

6
这应该是第一件事。如果无法正常工作,请尝试其他解决方案,但这绝对是最干净的。
杰拉德(Jerad)'17年

这给了逗号,我如何摆脱它呢?
乔纳森

您可能有一个尾随的空元素。如果您具有三个元素abc,则在与X一起加入时将得到aXbXc:ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""
Uli Martens

61

并使用joinerhttp://jinja.pocoo.org/docs/dev/templates/#joiner

{% set comma = joiner(",") %}
{% for user in userlist %}
    {{ comma() }}<a href="/profile/{{ user }}/">{{ user }}</a>
{% endfor %}  

正是出于这个确切的目的。通常,对于单个列表来说,加入或检查forloop.last就足够了,但是对于多组东西来说,它很有用。

关于为什么要使用它的更复杂的示例。

{% set pipe = joiner("|") %}
{% if categories %} {{ pipe() }}
    Categories: {{ categories|join(", ") }}
{% endif %}
{% if author %} {{ pipe() }}
    Author: {{ author() }}
{% endif %}
{% if can_edit %} {{ pipe() }}
    <a href="?action=edit">Edit</a>
{% endif %}

1
实际上,这对我来说效果很好,没有留下逗号。谢谢这个!
Daniel AndreiMincă17年

7

以下代码使用python3.5 shell中建议的jinja2连接过滤器 Uli Martens进行了工作:

>>> users = ["Sam", "Bob", "Joe"]
>>> from jinja2 import Template
>>> template = Template("{{ users|join(', ') }}")
>>> template.render(users=users)
'Sam, Bob, Joe'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.