Django – Cómo hacer tupla desembalaje en una plantilla «para» bucle

En mi views.py, estoy construyendo una lista de dos tuplas, donde el segundo elemento de la tupla es una lista más, como este:

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

En el viejo y simple de Python, me podría iteración de la lista como esta:

for product_type, products in list:
    print product_type
    for product in products:
        print product

Me parece que no puede hacer lo mismo en mi Django plantilla:

{% for product_type, products in product_list %}
    print product_type
    {% for product in products %}
        print product
    {% endfor %}
{% endfor %}

Me sale este error de Django:

Atrapado en una excepción al procesar: código postal argumento #2 debe apoyar iteración

Por supuesto, hay algo de código HTML en la plantilla, no instrucciones de impresión. Es tupla desembalaje no se admite en el lenguaje de plantillas de Django? O soy yo que va sobre el camino equivocado? Todo lo que estoy tratando de hacer es mostrar una simple jerarquía de objetos – hay varios tipos de producto, cada una con varios productos (en models.py, el Producto tiene una clave externa para Product_type, un simple de uno a muchos relación).

Obviamente, yo soy bastante nuevo en Django, por lo que el aporte se agradece.

  • Hable acerca de las tuplas, pero su pregunta contiene sólo las listas. Son cosas diferentes en python.
  • Que en realidad no tienen dos tuplas. Examine cuidadosamente su lista, usted tiene 4 elementos de la lista. Como Jonny Buchanan lo contrario, usted necesita para hacer esto: [ [Product_Type_1, [ product_1, product_2 ], ], [Product_Type_2, [ product_3, product_4 ], ], ] para obtener una lista de la versión de dos tuplas.
InformationsquelleAutor Chris Lawlor | 2008-11-07

5 Kommentare

  1. 64

    sería mejor si usted construye sus datos como {nota el ‘(‘ y ‘)’ puede ser intercambiado por ‘[‘ y ‘]’ respectivamente, siendo uno de tuplas, uno para listas}

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

    y tener la plantilla de hacer esto:

    {% for product_type, products in product_type_list %}
        {{ product_type }}
        {% for product in products %}
            {{ product }}
        {% endfor %}
    {% endfor %}

    la forma de tuplas/listas se desenvuelven en bucles for se basa en el elemento devuelto por el iterador de la lista.
    en cada iteración sólo un punto de devolución. la primera vez alrededor del bucle, Product_Type_1, el segundo de su lista de productos…

    • es decir, creía que eran la construcción de una lista de dos tuplas, pero se le olvidó la tupla parte – note el paréntesis que rodean el tipo de producto/producto lista de pares en el sistema de Cifrado de la respuesta de
    • Esto no funciona para los mayores de Django versiones (como el utilizado en el GAE). El uso de Ashwin Rao la respuesta de si obtiene este error: «‘para’ declaraciones con cinco palabras debe terminar en ‘invertidos’ «
  2. 75

    Otra manera es la siguiente.

    Si uno tiene una lista de tuplas decir:

    mylst = [(a, b, c), (x, y, z), (l, m, n)]

    entonces uno puede desempaquetar esta lista en el archivo de plantilla de la siguiente manera.
    En mi caso, yo tenía una lista de tuplas que contiene la dirección URL, el título y el resumen de un documento.

    {% for item in mylst %}    
         {{ item.0 }} {{ item.1}} {{ item.2 }}    
    {% endfor %}
    • Esto es exactamente lo que estaba buscando, gracias.
    • .0 … no es intuitivo en absoluto.
    • truco es recordar que el idioma de la plantilla hace que . significar cualquier cosa, desde la variable de acceso a la suscripción, pasando a través de la invocación del método, todos con la misma sintaxis… Aún está de acuerdo con usted, tho 🙂
    • ¿Por qué son las barras diagonales \ no?
  3. 5

    Debe utilizar de este modo:

    {% for product_type, products in product_list.items %}
        print product_type
        {% for product in products %}
            print product
        {% endfor %}
    {% endfor %}

    No te olvides de los elementos variables en el diccionario de datos

    • Finalmente, la respuesta que estaba buscando. Gracias!
  4. 3

    Si usted tiene un número fijo en su tuplas, sólo podría utilizar la indexación. Me falta la mezcla de un diccionario y los valores fueron tuplas, así que hice esto:

    De 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>
  5. 2

    Acaba de enviar la plantilla de una lista de los tipos de producto y hacer algo como:

    {% for product_type in product_type_list %}
        {{ product_type }}
        {% for product in product_type.products.all %}
            {{ product }}
        {% endfor %}
    {% endfor %}

    Ha sido un poco de tiempo, así que no recuerdo exactamente lo que la sintaxis es la siguiente, quiero saber si que funciona. Compruebe la documentación.

    • +1: no más de proceso en la vista
    • Chris Lawlor, no ha explicado cómo se acabó con la estructura de datos que tiene (que no es en realidad una lista de dos tuplas), pero este enfoque sugerido sería el resultado en N + 1 consultas para mostrar la lista de productos.
    • Aquí hay dragones. El uso de esta sugerencia, que está haciendo un viaje independiente a la base de datos para cada product_type. Sospecho que la minimización de la carga de base de datos es probablemente la motivación detrás de usar tuplas en el primer lugar.
    • Creo que se podría utilizar select_related() para mitigar la preocupación particular, a la derecha?

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea