zip (lista1, lista2) en Jinja2?

2 minutos de lectura

Estoy generando código en Jinja2 y con frecuencia quiero iterar a través de dos listas juntas (es decir, nombres y tipos de variables), ¿hay una manera simple de hacerlo o necesito simplemente pasar una lista precomprimida? No pude encontrar tal función en el documentos o googleando.

zip (lista1, lista2) en Jinja2?
Garrett

Modificar el jinja2.Environment espacio de nombres global mismo si lo considera oportuno.

import jinja2
env = jinja2.Environment()
env.globals.update(zip=zip)
# use env to load template(s)

Esto puede ser útil para separar la lógica de la vista (plantilla) de la lógica de la aplicación, pero también permite lo contrario. #separación de intereses

  • Para una aplicación Flask: app.jinja_env.globals.update(zip=zip)

    – Gmán

    02 feb.

  • Para una aplicación Pyramid, use env = config.get_jinja2_environment(). Luego continúa como arriba. Ver docs.pylonsproject.org/projects/pyramid_jinja2/en/latest/… para obtener detalles sobre cómo usar ese método correctamente en la configuración de su aplicación.

    – Arthur Hebert-Ryan

    15 jul. 19 en 18:02


Como no mencionó si está usando Flask o no, pensé en agregar mis hallazgos.

Para ser usado por un render_template() cree el filtro ‘zip’ usando el zip() función en el entorno Jinja2 utilizado por Flask.

app = Flask(__name__)
...
app.jinja_env.filters['zip'] = zip

Para usar esto dentro de una plantilla, hazlo así:

{% for value1, value2 in iterable1|zip(iterable2) %}
    {{ value1 }} is paired with {{ value2 }}
{% endfor %}

Tenga en cuenta que las cadenas son Jinja2 iterables, por lo que si intenta comprimir cadenas, obtendrá algunas cosas locas. Para asegurarse de que lo que desea comprimir sea iterable y no una cadena, haga esto:

{%  if iterable1 is iterable and iterable1 is not string 
   and iterable2 is iterable and iterable2 is not string %}
    {% for value1, value2 in iterable1|zip(iterable2) %}
        {{ value1 }} is paired with {{ value2 }}
    {% endfor %}
{% else %}
  {{ iterable1 }} is paired with {{ iterable2 }}
{% endif %}

  • Respuesta realmente útil al agregar configuración a la aplicación del matraz

    – mike-gallego

    13 oct.

  • ¡Gracias! Su segundo ejemplo zip funcionó a las mil maravillas en Jinja.

    – vboxer00

    6 ene a las 11:35

Para Flask, puede pasar el zip en el render_template()

  return render_template("home.html", zip=zip)

  • Obtuve la solución del comentario de @Chris Farr de stackoverflow.com/questions/52644035/…

    – Mantej Singh

    20 oct.

  • Muchas gracias. ¡La solución perfecta!

    – Gráfica de puntos

    hace 4 horas

  • OK, lo sospechaba mucho. FWIW, resolví esto combinando mis listas en una sola lista de una nueva clase, que probablemente sea más elegante de todos modos.

    – Juan Salvatier

    06 mar. 11 en 2:51

.

¿Ha sido útil esta solución?