¿Cómo generar una lista delimitada por comas en la plantilla jinja python?

3 minutos de lectura

avatar de usuario
Rolando

Si tengo una lista de users decir ["Sam", "Bob", "Joe"]quiero hacer algo donde pueda generar en mi archivo de plantilla jinja:

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

Quiero que la plantilla de salida sea:

Sam, Bob, Joe

Probé el código anterior para verificar si estaba en la última iteración del ciclo y, si no, no inserte una coma, pero no funciona. ¿Cómo hago esto?

  • jinja, como Python, no usa ! como operador de negación. “no” se escribe “no”.

    – Woble

    15 de agosto de 2012 a las 17:49

avatar de usuario
joe dia

quieres tu if comprobar que sea:

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

Tenga en cuenta que también puede acortar el código usando Si expresión:

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

  • Esto es increíble, especialmente al final del ciclo en html

    – Sinux

    27 de agosto de 2015 a las 14:38

  • Solo para su información, es posible que deba hacer de esto un if/else según su configuración. Más información. se puede encontrar aquí: github.com/pallets/jinja/issues/710

    – Pablo Calabro

    19 de septiembre de 2017 a las 23:24

  • o es algunos casos {{ "," if not forloop.last }}

    – obotezat

    3 oct 2017 a las 13:09

  • Secundo el comentario sobre agregar otra cosa. esto funcionó para mí {{ "," if not loop.last else "" }}

    – ahong

    5 julio 2019 a las 16:00

  • en mi caso fue forloop en vez de loop y {% en vez de {{como esto: {% if not forloop.last %},{% endif %}. Otras soluciones no funcionaron

    – PD

    14 oct 2020 a las 12:46


avatar de usuario
uli martens

También puede usar el incorporado join filtrar así:

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

  • Si bien esto funciona para crear un csv, al ver su ejemplo anterior, no se puede usar con el ancla circundante.

    – triunenature

    22 de noviembre de 2015 a las 6:18

  • Este enfoque tampoco funciona bien con el escape: [‘{{ [‘a\”, ‘b’]|unirse(“‘, ‘”) }}’]produce [‘a&#39;&#39;, &#39;b’]

    – estofado básico

    24 de noviembre de 2015 a las 3:34


  • Esto debería ser lo primero que se intente. Si no funciona como se desea, pruebe con otra solución, pero definitivamente esta es la más limpia.

    – Jerad

    22 de julio de 2017 a las 15:40

  • Esto da una coma final, ¿cómo me deshago de eso?

    – Jonathan

    17 de noviembre de 2017 a las 19:12

  • Probablemente tenga un elemento final vacío. Si tiene tres elementos abc, obtendrá aXbXc cuando se una con X: ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""

    -Uli Martens

    18 de noviembre de 2017 a las 20:12


avatar de usuario
valentía

y usando el joiner de https://jinja.palletsprojects.com/templates/#joiner

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

Está hecho para este propósito exacto. Normalmente, una combinación o una verificación de forloop.last sería suficiente para una sola lista, pero para varios grupos de cosas es útil.

Un ejemplo más complejo de por qué lo usarías.

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

  • En realidad, esto funcionó bastante bien para mí, sin dejar una coma al final. ¡Gracias por este!

    – Daniel Andrei Minca

    19 de diciembre de 2017 a las 12:49

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad