2011-01-19 12 views
9

Estoy pasando dos listas a una plantilla. Normalmente, si yo estaba interactuando sobre una lista que haría algo como estoContador de Django en el bucle de la lista de índice

{% for i in list %} 

pero tengo dos listas que tengo que acceder en paralelo, es decir. el enésimo elemento en una lista corresponde al enésimo elemento en la otra lista. Mi idea era recorrer una lista y acceder a un elemento en la otra lista utilizando forloop.counter0, pero no puedo entender la sintaxis para que funcione.

Gracias

Respuesta

13

No puede. La forma más sencilla es preprocesasen le datos en un zipped list, como este

En su opinión

x = [1, 2, 3] 
y = [4, 5, 6] 
zipped = zip(x, y) 

Luego, en que la plantilla:

{% for x, y in zipped %} 
    {{ x }} - {{ y }} 
{% endfor %} 
+0

¿Cree que esta es una solución mejor que usar un multiformato? Ciertamente me gustan los resultados en una plantilla más simple – JPC

0

No creo que pueda hacerlo así. Necesitará una etiqueta de plantilla, o mucho mejor, para alinear las listas en su lógica de vista, antes de pasar una estructura de datos alineada a su plantilla.

5

Parece que estás en busca de mi django-multiforloop. Desde el README:

Rendering esta plantilla

{% load multifor %} 
{% for x in x_list; y in y_list %} 
    {{ x }}:{{ y }} 
{% endfor %} 

con este contexto

context = { 
    "x_list": ('one', 1, 'carrot'), 
    "y_list": ('two', 2, 'orange') 
} 

es la salida

one:two 
1:2 
carrot:orange 
6

terminé tener que hacer esto:

{% for x in x_list %} 
    {% for y in y_list %} 
    {% if forloop.counter == forloop.parentloop.counter %} 
     Do Something 
    {% endif %} 
    {% endfor %} 
{% endfor %} 
+0

. Creo que es una solución 'O (n^2)' cuando podrías hacerlo simplemente con 'O (n)'. – Pant

9

Para acceder a una iterables utilizando un contador forloop He codificado el siguiente filtro muy simple:

from django import template 

register = template.Library() 

@register.filter 
def index(sequence, position): 
    return sequence[position] 

y luego puedo usar en mis plantillas como (no se olvide de cargarlo):

{% for item in iterable1 %} 
    {{ iterable2|index:forloop.counter0 }} 
{% endfor %} 

Espero que esto ayude a alguien más!

+0

Esto, aunque tomar algunos pasos adicionales para implementar, permite el uso que 'forloop.counter0' debe proporcionar con las variables en for bucles. Cambié la declaración de devolución a: 'return sequence [position]' para mis necesidades. – Flash

+1

@Flash ¡En realidad estoy usando 'sequence [position]' en mi código real también, actualizado aquí! – Caumons

Cuestiones relacionadas