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 !는 부정 연산자로 사용하지 않습니다 . "not"은 "not"입니다.
Wooble

답변:


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
폴 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

6
이것이 가장 먼저 시도되어야합니다. 원하는대로 작동하지 않으면 다른 해결책을 시도해보십시오. 그러나 이것은 가장 깨끗합니다.
Jerad

이것은 후행 쉼표를 제공합니다. 어떻게 제거합니까?
조나단

아마도 빈 요소가있을 것입니다. 세 가지 요소 abc가 있다면 X와 합류 할 때 aXbXc를 얻게됩니다.ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""
Uli Martens

61

그리고를 사용 joiner에서 http://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 Andrei Mincă

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.