Comment incrémenter une variable sur une boucle for dans le modèle jinja?
Je voudrais faire quelque chose comme:
La Variable p provient de test.py qui est une liste ['a', 'b','c','d']
{% for i in p %}
{{variable++}}
{{variable}}
La sortie du résultat est: 1 2 3 4
6 réponses
Vous pouvez utiliser set
pour incrémenter un compteur:
{% set count = 1 %}
{% for i in p %}
{{ count }}
{% set count = count + 1 %}
{% endfor %}
, Ou vous pouvez utiliser loop.index
:
{% for i in p %}
{{ loop.index }}
{% endfor %}
Comme le dit Jeroen, il y a des problèmes de portée: si vous définissez 'count' en dehors de la boucle, vous ne pouvez pas le modifier à l'intérieur de la boucle.
, Vous pouvez désactiver ce comportement en utilisant un objet plutôt qu'un scalaire pour "compter":
{% set count = [1] %}
Vous pouvez maintenant manipuler count dans un forloop ou même un % include%. Voici comment je compte incrémenter (Oui, c'est kludgy mais oh bien):
{% if count.append(count.pop() + 1) %}{% endif %} {# increment count by 1 #}
Après 2.10, Pour résoudre le problème de portée, vous pouvez faire quelque chose comme ceci:
{% set count = namespace(a=0) %}
{% for i in p %}
{{ count.a }}
{% set count.a = count.a + 1 %}
{% endfor %}
Voici ma solution:
Mettre tous les compteurs dans un dictionnaire:
{% set counter = {
'counter1': 0,
'counter2': 0,
'etc': 0,
} %}
Définir une macro pour incrémenter facilement:
{% macro increment(dct, key, inc=1)%}
{% if dct.update({key: dct[key] + inc}) %} {% endif %}
{% endmacro %}
Maintenant, chaque fois que vous voulez incrémenter le compteur 'counter1', faites simplement:
{{ increment(counter, 'counter1') }}
Je luttais avec ce comportement aussi. Je voulais changer de classe div à jinja en fonction du compteur. J'ai été surpris que la manière pythonique ne fonctionne pas. Le code suivant réinitialisait mon compteur à chaque itération, donc je n'avais que la classe rouge.
{% if sloupec3: %}
{% set counter = 1 %}
{% for row in sloupec3: %}
{% if counter == 3 %}
{% set counter = 1 %}
{% endif %}
{% if counter == 1: %}
<div class="red"> some red div </div>
{% endif %}
{% if counter == 2: %}
<div class="gray"> some gray div </div>
{% endif %}
{% set counter = counter + 1 %}
{% endfor %}
{% endif %}
J'ai utilisé la boucle.index comme ça et ça marche:
{% if sloupec3: %}
{% for row in sloupec3: %}
{% if loop.index % 2 == 1: %}
<div class="red"> some red div </div>
{% endif %}
{% if loop.index % 2 == 0: %}
<div class="gray"> some gray div </div>
{% endif %}
{% endfor %}
{% endif %}
Est venu chercher la façon de faire de Django et a trouvé ce post. Peut-être que quelqu'un d'autre a besoin de la solution django qui vient ici.
{% for item in item_list %}
{{ forloop.counter }} {# starting index 1 #}
{{ forloop.counter0 }} {# starting index 0 #}
{# do your stuff #}
{% endfor %}
Lire la suite ici: https://docs.djangoproject.com/en/1.11/ref/templates/builtins/