Estoy generando código en Jinja2 y con frecuencia quiero iterar a través de dos listas (es decir, nombres y tipos de variables), ¿hay alguna manera simple de hacerlo o solo tengo que pasar una lista preincronizada? No pude encontrar dicha función en el docs o en Google.zip (list1, list2) en Jinja2?
Respuesta
Modificar el jinja2.Environment global namespace sí 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 vista (plantilla) de la lógica de la aplicación, pero también permite lo contrario. # separationofconcerns
No creo que los lenguajes de creación de plantillas permitan hacer el zip de dos contenedores durante el ciclo. Aquí hay una pregunta similar para django y la plantilla de jinja está muy cerca de django.
Debería preconstruir el contenedor comprimido y pasarlo a su plantilla.
>> for i,j in zip(range(10),range(20,30)):
... print i,j
...
es equivalente a
>>> [(i,j) for i,j in zip(range(10),range(20,30))]
Como no mencionaste si estás usando Flask o no, pensé que agregaría mis hallazgos.
Para ser utilizado por un render_template()
cree el filtro 'zip' utilizando la función zip()
en el entorno Jinja2 utilizado por Flask.
app = Flask(__name__)
...
app.jinja_env.filters['zip'] = zip
Para utilizar esta dentro de una plantilla de hacerlo de esta manera:
{% for value1, value2 in iterable1|zip(iterable2) %}
{{ value1 }} is paired with {{ value2 }}
{% endfor %}
Tenga en cuenta que las cadenas son iterables Jinja2 por lo que si se intenta comprimir en cadenas obtendrá algunas cosas locas. Para asegurarse de que lo que desea comprimir es 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 %}
- 1. Arrastrar y soltar para poner elementos de List1 a List2
- 2. ¿Linq/.NET3.5 admite un método 'zip'?
- 3. ¿Hay un método zip en .Net?
- 4. ¿Cómo combinar más de dos listas genéricas en C# Zip?
- 5. webapp2 + jinja2: ¿Cómo puedo obtener uri_for() trabajando en jinja2-views
- 6. ¿Iterar el objeto en Jinja2?
- 7. Jinja2 en Google App Engine
- 8. concat multiple block en jinja2?
- 9. Redondeo en soportes de jinja2
- 10. jinja2 + reStructured Markup
- 11. Django: ¿Cambia a Jinja2?
- 12. ¿Mako o Jinja2?
- 13. las variables Jinja2 anidado
- 14. Jinja2 y JSON
- 15. Jinja2 If Statement
- 16. Zip Stream en PHP
- 17. Cómo anular bloques anidados en Jinja2
- 18. Ordenar dict en el bucle jinja2
- 19. compare dos variables en la plantilla jinja2
- 20. múltiples bloques de mismo nombre en Jinja2
- 21. Python: ¿cómo formateo una fecha en Jinja2?
- 22. Modificar los atributos del diccionario en jinja2
- 23. Obtener un parámetro de solicitud en Jinja2
- 24. ¿Cómo uso expresiones regulares en Jinja2?
- 25. Prueba de una lista en Jinja2
- 26. lanzando ints a str en Jinja2
- 27. ¿Cómo se ordena una lista en Jinja2?
- 28. Objetivo C - Acceso a archivos en zip sin extraer zip
- 29. jinja2: variables de escape html
- 30. if else ramming in jinja2
OK, lo sospechaba mucho. FWIW, resolví esto al combinar mis listas en una sola lista de una nueva clase, que de todos modos es más elegante. –