Làm cách nào để xuất danh sách được phân cách bằng dấu phẩy trong mẫu python jinja?


175

Nếu tôi có một danh sách usersnói ["Sam", "Bob", "Joe"], tôi muốn làm một cái gì đó mà tôi có thể xuất ra trong tệp mẫu jinja của mình:

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

Tôi muốn làm cho mẫu đầu ra là:

Sam, Bob, Joe

Tôi đã thử đoạn mã trên để kiểm tra xem nó có phải ở lần lặp cuối cùng của vòng lặp không và nếu không, thì đừng chèn dấu phẩy, nhưng nó không hoạt động. Làm thế nào để tôi làm điều này?


jinja, giống như Python, không sử dụng !như một toán tử phủ định. "không" được đánh vần là "không".
Wooble

Câu trả lời:


301

Bạn muốn ifkiểm tra của bạn là:

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

Lưu ý rằng bạn cũng có thể rút ngắn mã bằng cách sử dụng If Expression :

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

2
Điều này thật tuyệt vời, đặc biệt là ở cuối vòng lặp trong html
Sinux

7
Chỉ cần fyi, bạn có thể cần phải làm điều này nếu / khác dựa trên cài đặt của bạn. Thêm thông tin. có thể tìm thấy ở đây: github.com/pallets/jinja/issues/710
Paul Calabro

1
hoặc là một số trường hợp{{ "," if not forloop.last }}
obotezat

5
Tôi thứ hai bình luận về việc thêm một người khác. Điều này làm việc cho tôi{{ "," if not loop.last else "" }}
ahong

197

bạn cũng có thể sử dụng bộ lọc "tham gia" dựng sẵn ( http://jinja.pocoo.org/docs/temsheet/#join như thế này:

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

1
Trong khi điều này hoạt động để tạo một csv, xem ví dụ của anh ta ở trên, nó không thể được sử dụng với neo xung quanh.
triunenature

Cách tiếp cận này cũng không hoạt động tốt với thoát: ['{{[' a \ '', 'b'] | tham gia ("','")}} '] tạo ra [' a & # 39; & # 39; , & # 39; b ']
stewbasic

6
Đây phải là điều đầu tiên cố gắng. Nếu nó không hoạt động như mong muốn, thì hãy thử một giải pháp khác, nhưng điều này chắc chắn là sạch nhất.
Giê

Điều này đưa ra một dấu phẩy, làm thế nào để tôi thoát khỏi điều đó?
Jonathan

Bạn có thể có một yếu tố trống rỗng. Nếu bạn có ba yếu tố abc, bạn sẽ nhận được aXbXc khi tham gia với X:ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""
Uli Martens

61

Và sử dụng joinertừ http://jinja.pocoo.org/docs/dev/temsheet/#joiner

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

Nó được làm cho mục đích chính xác này. Thông thường, việc tham gia hoặc kiểm tra forloop.last sẽ đủ cho một danh sách, nhưng đối với nhiều nhóm điều thì nó hữu ích.

Một ví dụ phức tạp hơn về lý do tại sao bạn sẽ sử dụng nó.

{% 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
Điều này thực sự làm việc khá tốt đối với tôi, mà không để lại dấu phẩy. Cảm ơn vì điều này!
Daniel Andrei Mincă

7

Đoạn mã sau hoạt động bằng bộ lọc tham gia jinja2 được Uli Martens đề xuất trong trình bao python3.5:

>>> users = ["Sam", "Bob", "Joe"]
>>> from jinja2 import Template
>>> template = Template("{{ users|join(', ') }}")
>>> template.render(users=users)
'Sam, Bob, Joe'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.