2010-01-14 16 views
5

Mi código de la vista se ve básicamente como esto:¿Accediendo a matrices paralelas en las plantillas de Django?

context = Context() 
context['some_values'] = ['a', 'b', 'c', 'd', 'e', 'f'] 
context['other_values'] = [4, 8, 15, 16, 23, 42] 

Me gustaría que mi código de la plantilla a tener este aspecto:

{% for some in some_values %} 
    {% with index as forloop.counter0 %} 
    {{ some }} : {{ other_values.index }} <br/> 
    {% endwith %} 
{% endfor %} 

Y esperaría que esta a la salida:

a : 4 <br/> 
b : 8 <br/> 
c : 15 <br/> 
d : 16 <br/> 
e : 23 <br/> 
f : 42 <br/> 

es posible? Estoy descubriendo que mi declaración "con" está funcionando, pero el uso de esa variable como referencia no funciona. Sospecho que para {{other_values.index}} está haciendo other_values ​​['index'] en lugar de other_values ​​[index]. es posible?

+0

Siempre podría escribir una etiqueta de plantilla personalizada para este caso de uso, pero parece un exceso. No me gustaría tener que decir {{other_values ​​| access: index}}. – slacy

Respuesta

8

zip(some_values, other_values), entonces lo usan en la plantilla

from itertools import izip 
some_values = ['a', 'b', 'c', 'd', 'e', 'f'] 
other_values = [4, 8, 15, 16, 23, 42] 
context['zipped_values'] = izip(some_values, other_values) 

{% for some, other in zipped_values %} 
    {{ some }}: {{ other }} <br/> 
{% endfor %} 
+1

Yo usaría 'itertools.izip' en su lugar. –

+0

Preferiría no tener que agregar más al contexto, y esto hace que los datos de contexto sean bastante redundantes. Además, si cambio mi plantilla (por ejemplo, para no tener acceso a estas matrices paralelas), debo recordar limpiar el código de la vista. Parece que se encuentra a caballo entre la información y la presentación. – slacy

+1

@slacy: su pregunta no es solo sobre la presentación. La asociación entre elementos es esencial en dos matrices "paralelas". Las matrices "paralelas" son realmente solo 2 tuplas en espera de ser creadas. * Debes * ponerlos juntos en la función de vista porque pertenecen a la lógica. Es por eso que los estás presentando juntos. –

Cuestiones relacionadas