Pregunta

En mi views.py, estoy construyendo una lista de dos tuplas, donde el segundo elemento en la tupla es otra lista, como esta:

[ Product_Type_1, [ product_1, product_2 ],
  Product_Type_2, [ product_3, product_4 ]]

En Python antiguo y simple, 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:

Se detectó una excepción al procesar: el argumento zip # 2 debe admitir la iteración

Por supuesto, hay algo de marcado HTML en la plantilla, no declaraciones impresas. ¿El desempaquetado de tuplas no es compatible con el lenguaje de plantilla Django? ¿O voy por 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 foránea para Product_type, una relación simple de uno a muchos).

Obviamente, soy bastante nuevo en Django, por lo que cualquier comentario sería apreciado.

¿Fue útil?

Solución

sería mejor si construye sus datos como {tenga en cuenta que '(' y ')' se pueden intercambiar por '[' y ']' respectivamente, uno para tuplas, otro 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 las tuplas / listas se desempaquetan para bucles se basa en el elemento devuelto por el iterador de lista. en cada iteración solo se devolvió un artículo. la primera vez en el ciclo, Product_Type_1, la segunda en su lista de productos ...

Otros consejos

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 %}

Debe 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

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. Consulte la documentación .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top