Wie kann ich eine durch Kommas getrennte Liste in einer Jinja-Python-Vorlage ausgeben?

Lesezeit: 3 Minuten

Benutzer-Avatar
Rolando

Wenn ich eine Liste habe users sagen ["Sam", "Bob", "Joe"]ich möchte etwas tun, wo ich in meiner Jinja-Vorlagendatei ausgeben kann:

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

Ich möchte die Ausgabevorlage wie folgt gestalten:

Sam, Bob, Joe

Ich habe den obigen Code ausprobiert, um zu überprüfen, ob es sich um die letzte Iteration der Schleife handelt, und wenn nicht, fügen Sie kein Komma ein, aber es funktioniert nicht. Wie mache ich das?

  • jinja verwendet wie Python keine ! als Negationsoperator. „not“ wird „not“ geschrieben.

    – Wackel

    15. August 2012 um 17:49 Uhr

Benutzer-Avatar
Joe Tag

Du willst deine if überprüfen zu sein:

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

Beachten Sie, dass Sie den Code auch kürzen können, indem Sie verwenden Wenn Ausdruck:

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

  • Das ist großartig, besonders am Ende der Schleife in HTML

    – Sinux

    27. August 2015 um 14:38 Uhr

  • Nur zu Ihrer Information, Sie müssen dies möglicherweise basierend auf Ihren Einstellungen zu einem if/else machen. Mehr Info. finden Sie hier: github.com/pallets/jinja/issues/710

    – Paul Calabro

    19. September 2017 um 23:24 Uhr

  • oder ist einige Fälle {{ "," if not forloop.last }}

    – obotezat

    3. Oktober 2017 um 13:09 Uhr

  • Ich stimme dem Kommentar über das Hinzufügen eines anderen zu. Das hat bei mir funktioniert {{ "," if not loop.last else "" }}

    – ahong

    5. Juli 2019 um 16:00 Uhr

  • In meinem Fall war es forloop Anstatt von loop und {% Anstatt von {{so was: {% if not forloop.last %},{% endif %}. Andere Lösungen haben nicht funktioniert

    – PD

    14. Oktober 2020 um 12:46 Uhr


Benutzer-Avatar
Ulli Martens

Du könntest auch das eingebaute verwenden join so filtern:

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

  • Dies funktioniert zwar zum Erstellen einer CSV-Datei, siehe sein obiges Beispiel, kann aber nicht mit dem umgebenden Anker verwendet werden.

    – Dreieinigkeit

    22. November 2015 um 6:18 Uhr

  • Dieser Ansatz funktioniert auch nicht gut mit Flucht: [‘{{ [‘a\”, ‘b’]|join(“‘, ‘”) }}’]produziert [‘a&#39;&#39;, &#39;b’]

    – Eintopfbasic

    24. November 2015 um 3:34 Uhr


  • Dies sollte als erstes versucht werden. Wenn es nicht wie gewünscht funktioniert, versuchen Sie es mit einer anderen Lösung, aber diese ist definitiv die sauberste.

    – Jarad

    22. Juli 2017 um 15:40 Uhr

  • Dies gibt ein nachgestelltes Komma, wie werde ich das los?

    – Jonathan

    17. November 2017 um 19:12 Uhr

  • Sie haben wahrscheinlich ein nachfolgendes leeres Element. Wenn Sie drei Elemente abc haben, erhalten Sie aXbXc, wenn Sie mit X verbinden: ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""

    – Uli Martens

    18. November 2017 um 20:12 Uhr


Benutzer-Avatar
dalore

Und mit der joiner aus https://jinja.palletsprojects.com/templates/#joiner

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

Es ist genau für diesen Zweck gemacht. Normalerweise würde ein Join oder eine Überprüfung von forloop.last für eine einzelne Liste ausreichen, aber für mehrere Gruppen von Dingen ist es nützlich.

Ein komplexeres Beispiel, warum Sie es verwenden würden.

{% 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 %}

  • Das hat bei mir eigentlich ganz gut funktioniert, ohne ein nachgestelltes Komma zu hinterlassen. Danke für diesen!

    – Daniel Andrei Minca

    19. Dezember 2017 um 12:49 Uhr

1055200cookie-checkWie kann ich eine durch Kommas getrennte Liste in einer Jinja-Python-Vorlage ausgeben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy