57 votes

Django - Comment décompresser un tuple dans une boucle 'for' de modèle ?

Dans mon views.py, je construis une liste de deux n-uplets, où le deuxième élément du n-uplet est une autre liste, comme ceci :

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

Dans le bon vieux Python, je pourrais itérer la liste comme ceci :

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

Je ne parviens pas à faire la même chose dans mon modèle Django :

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

Je reçois cette erreur de Django :

Une exception a été détectée lors du rendu : l'argument zip n°2 doit supporter l'itération.

Bien entendu, le modèle contient des balises HTML, et non des instructions d'impression. Le dépaquetage des tuple n'est-il pas pris en charge par le langage de modèle de Django ? Ou est-ce que je m'y prends mal ? Tout ce que j'essaie de faire est d'afficher une simple hiérarchie d'objets - il y a plusieurs types de produits, chacun avec plusieurs produits (dans models.py, Product a une clé étrangère vers Product_type, une simple relation un à plusieurs).

Évidemment, je suis assez novice en matière de Django, aussi toute contribution sera-t-elle appréciée.

77voto

Ashwin Rao Points 351

Une autre façon de procéder est la suivante.

Si on a une liste de tuples, disons

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

alors on peut décomposer cette liste dans le fichier modèle de la manière suivante. Dans mon cas, j'avais une liste de tuples contenant l'URL, le titre et le résumé d'un document.

{\% for item in mylst \%}    
     {{ item.0 }} {{ item.1}} {{ item.2 }}    
{\% endfor \%}

64voto

Jake Points 1900

Il serait préférable que vous construisiez vos données comme {notez que les '(' et ')' peuvent être remplacés par '[' et ']' respectivement, l'un étant pour les tuples, l'autre pour les listes}

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

et que le modèle fasse ça :

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

la façon dont les tuples/listes sont décomposés dans les boucles for est basée sur l'élément retourné par l'itérateur de liste. à chaque itération, un seul élément est retourné. la première fois dans la boucle, Product_Type_1, la seconde, votre liste de produits...

5voto

Vous devez utiliser ce moyen :

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

N'oubliez pas les éléments variables dans les données du dictionnaire.

2voto

Harley Holcombe Points 34618

Il suffit d'envoyer au modèle une liste de types de produits et de faire quelque chose du genre :

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

Cela fait un petit moment que je ne me souviens pas exactement de la syntaxe, faites-moi savoir si cela fonctionne. Vérifiez le documentation .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X