python - Django-Cómo hacer tuple desempacando en una plantilla ''for'' loop
templates tuples (5)
Debes usarlo de esta manera:
{% for product_type, products in product_list.items %}
print product_type
{% for product in products %}
print product
{% endfor %}
{% endfor %}
No olvide los elementos variables en los datos del diccionario
En mi views.py, estoy construyendo una lista de dos tuplas, donde el segundo elemento de la tupla es otra lista, como esta:
[ Product_Type_1, [ product_1, product_2 ],
Product_Type_2, [ product_3, product_4 ]]
En el viejo y simple Python, podría iterar la lista de esta manera:
for product_type, products in list:
print product_type
for product in products:
print product
Parece que no puedo hacer lo mismo en mi plantilla de Django:
{% for product_type, products in product_list %}
print product_type
{% for product in products %}
print product
{% endfor %}
{% endfor %}
Recibo este error de Django:
Capturado una excepción durante la representación: el argumento de zip # 2 debe admitir la iteración
Por supuesto, hay algo de marcado HTML en la plantilla, no declaraciones de impresión. ¿No se admite el desempaquetado de tuplas en el lenguaje de plantillas de Django? ¿O estoy yendo sobre esto de la manera incorrecta? Todo lo que intento hacer es mostrar una jerarquía simple de objetos: hay varios tipos de productos, cada uno con varios productos (en models.py, Product tiene una clave externa para Product_type, una relación simple de uno a muchos).
Obviamente, soy bastante nuevo para Django, por lo que cualquier comentario sería apreciado.
Otra forma es la siguiente.
Si uno tiene una lista de tuplas, diga:
mylst = [(a, b, c), (x, y, z), (l, m, n)]
entonces uno puede descomprimir esta lista en el archivo de plantilla de la siguiente manera. En mi caso, tenía una lista de tuplas que contenían la URL, el título y el resumen de un documento.
{% for item in mylst %}
{{ item.0 }} {{ item.1}} {{ item.2 }}
{% endfor %}
Si tiene un número fijo en sus tuplas, puede usar la indexación. Necesitaba mezclar un diccionario y los valores eran tuplas, así que hice esto:
En la vista:
my_dict = {''parrot'': (''dead'', ''stone''), ''lumberjack'': (''sleep_all_night'', ''work_all_day'')}
En la plantilla:
<select>
{% for key, tuple in my_dict.items %}
<option value="{{ key }}" important-attr="{{ tuple.0 }}">{{ tuple.1 }}</option>
{% endfor %}
</select>
Simplemente envíe a la plantilla una lista de tipos de productos y haga algo como:
{% for product_type in product_type_list %}
{{ product_type }}
{% for product in product_type.products.all %}
{{ product }}
{% endfor %}
{% endfor %}
Ha pasado un tiempo, así que no puedo recordar exactamente cuál es la sintaxis, avíseme si eso funciona. Verifique la documentation .
sería mejor si construyes tus datos como {ten en cuenta que ''('' y '')'' pueden intercambiarse por ''['' y '']'' respectivamente, uno para tuplas, uno para listas}
[ (Product_Type_1, ( product_1, product_2 )),
(Product_Type_2, ( product_3, product_4 )) ]
y haga que la plantilla haga esto:
{% for product_type, products in product_type_list %}
{{ product_type }}
{% for product in products %}
{{ product }}
{% endfor %}
{% endfor %}
la forma en que se desempaquetan las tuplas / listas para los bucles se basa en el elemento devuelto por el iterador de la lista. cada iteración solo se devolvió un ítem. la primera vez en el ciclo, Product_Type_1, el segundo es su lista de productos ...