jinja pythonテンプレートでカンマ区切りリストを出力する方法は?


175

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

回答:


301

if小切手は次のようにしてください。

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

If式を使用してコードを短くすることもできます。

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

2
これは特にhtmlのループの終わりに
すばらしい

7
ただfyi、あなたの設定に基づいてこれをif / elseにする必要があるかもしれません。より詳しい情報。ここで見つけることができます:github.com/pallets/jinja/issues/710
ポールカラブロ

1
またはいくつかのケースです{{ "," if not forloop.last }}
obotezat

5
私は、elseを追加することについてのコメントの2番目です。これは私のために働きました{{ "," if not loop.last else "" }}
ahong

197

組み込みの「結合」フィルターを使用することもできます(http://jinja.pocoo.org/docs/templates/#join like this:

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

1
これはcsvを作成するために機能しますが、上記の彼の例を参照すると、周囲のアンカーでは使用できません。
triunenature 2015年

このアプローチもエスケープではうまく機能しません。['{{[' a \ ''、 'b'] | join( "'、'")}} ']は[' a&#39;&#39;を生成します。 、&​​#39; b ']
stewbasic 2015年

6
これが最初に試みられるべきです。期待どおりに機能しない場合は、別の解決策を試してください。ただし、これが間違いなく最もクリーンです。
ジェラド2017

これは末尾にコンマを与えますが、どうすればそれを取り除くことができますか?
ジョナサン

末尾に空の要素がある可能性があります。あなたは三つの要素を持っていればXと結合するとき、ABCあなたはaXbXcを取得します:ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""
ウリマルテンス

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ă2017

7

次のコードは、python3.5シェルで提案されたjinja2結合フィルター Uli Martensを使用して機能しました。

>>> users = ["Sam", "Bob", "Joe"]
>>> from jinja2 import Template
>>> template = Template("{{ users|join(', ') }}")
>>> template.render(users=users)
'Sam, Bob, Joe'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.