วิธีการส่งออกรายการคั่นด้วยจุลภาคในแม่แบบ jinja python?


179

ถ้าฉันมีรายการusersพูด["Sam", "Bob", "Joe"]ฉันต้องการทำบางสิ่งที่ฉันสามารถส่งออกในไฟล์เทมเพลต jinja ของฉัน:

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

ฉันต้องการทำให้แม่แบบผลลัพธ์เป็น:

Sam, Bob, Joe

ฉันลองใช้รหัสข้างต้นเพื่อตรวจสอบว่ามันอยู่ในการวนซ้ำครั้งล่าสุดของลูปหรือไม่ถ้าไม่ก็อย่าใส่เครื่องหมายจุลภาค แต่มันใช้ไม่ได้ ฉันจะทำสิ่งนี้ได้อย่างไร


jinja เช่น Python ไม่ได้ใช้!เป็นตัวดำเนินการปฏิเสธ "ไม่ใช่" ถูกสะกด "ไม่ใช่"
Wooble

คำตอบ:


306

คุณต้องการให้ifเช็คของคุณเป็น:

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

โปรดทราบว่าคุณสามารถย่อรหัสให้สั้นลงได้โดยใช้If Expression :

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

2
มันยอดเยี่ยมมากโดยเฉพาะที่ส่วนท้ายของลูปใน html
Sinux

7
เพียงแค่ fyi คุณอาจต้องทำให้มันเป็น if / else ตามการตั้งค่าของคุณ ข้อมูลเพิ่มเติม. สามารถพบได้ที่นี่: github.com/pallets/jinja/issues/710
Paul Calabro

1
หรือเป็นบางกรณี{{ "," if not forloop.last }}
obotezat

5
ฉันสองความคิดเห็นเกี่ยวกับการเพิ่มอีก นี้ทำงานให้ฉัน{{ "," if not loop.last else "" }}
Ahong

197

คุณสามารถใช้ตัวกรอง "เข้าร่วม" builtin ( http://jinja.pocoo.org/docs/templates/#joinเช่นนี้:

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

1
ขณะนี้ใช้งานได้กับการสร้าง csv เมื่อเห็นตัวอย่างของเขาด้านบนมันไม่สามารถใช้กับสมอล้อม
triunenature

วิธีการนี้ยังใช้งานไม่ได้กับการหลบหนี: ['{{[' a \ '', 'b'] | เข้าร่วม ("','")}} '] สร้าง [' a & # 39; & # 39; , & # 39; b ']
stewbasic

6
นี่ควรเป็นสิ่งแรกที่พยายามทำ หากวิธีนี้ไม่ได้ผลตามที่ต้องการให้ลองวิธีอื่น แต่วิธีนี้สะอาดที่สุด
Jerad

สิ่งนี้ให้คอมม่าต่อท้ายฉันจะกำจัดมันได้อย่างไร
Jonathan

คุณอาจมีองค์ประกอบว่างเปล่าต่อท้าย หากคุณมีสามองค์ประกอบ abc คุณจะได้รับ aXbXc เมื่อเข้าร่วมกับ X: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

โค้ดต่อไปนี้ทำงานโดยใช้jinja2 join filter Uli Martens ที่แนะนำในเชลล์ python3.5:

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