Question

Dans mon view.py, je construis une liste de deux-tuples, où le deuxième élément du tuple est une autre liste, comme ceci:

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

En clair, en vieux Python, je pourrais itérer la liste comme suit:

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

Je n'arrive 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:

Attrapé une exception lors du rendu: l'argument zip # 2 doit prendre en charge l'itération

Bien sûr, le modèle contient des balises HTML, et non des instructions print. La décompression de tuple n'est-elle pas prise en charge dans le langage de modèle Django? Ou est-ce que je m'y prend mal? Tout ce que j'essaie de faire, c'est d'afficher une simple hiérarchie d'objets: il existe plusieurs types de produits, chacun avec plusieurs produits (dans models.py, Product a une clé étrangère à Product_type, une simple relation un à plusieurs).

Évidemment, je suis un nouveau venu dans Django, alors toute contribution serait appréciée.

Était-ce utile?

La solution

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

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

et demandez au modèle de faire ceci:

{% 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écompactées dans les boucles for est basée sur l'élément renvoyé par l'itérateur de liste. à chaque itération, un seul article a été renvoyé. la première fois, Product_Type_1, la seconde votre liste de produits ...

Autres conseils

Une autre façon est la suivante.

Si vous avez une liste de n-uplets, dites:

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

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

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

Vous devez utiliser cette méthode:

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

Si vous avez un nombre fixe dans vos n-uplets, vous pouvez simplement utiliser l'indexation. J'avais besoin de mélanger un dictionnaire et les valeurs étaient des tuples, alors j'ai fait ceci:

Dans la vue:

my_dict = {'parrot': ('dead', 'stone'), 'lumberjack': ('sleep_all_night', 'work_all_day')}

Dans le modèle:

<select>
  {% for key, tuple in my_dict.items %}
    <option value="{{ key }}" important-attr="{{ tuple.0 }}">{{ tuple.1 }}</option>
  {% endfor %}
</select>

Envoyez simplement au modèle une liste de types de produits et procédez comme suit:

{% 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, laissez-moi savoir si cela fonctionne. Consultez la documentation .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top