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

49
demandé sur denfromufa 2011-09-24 10:31:27

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

Vérifiez la documentation du concepteur de modèles .

96
répondu zeekay 2011-09-24 06:38:33

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 #}
40
répondu Peter Hollingsworth 2015-09-21 17:12:22

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 %}
9
répondu Patrick José Pereira 2018-04-06 19:11:08

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') }}
9
répondu Jahid 2018-04-15 08:19:00

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 %}
0
répondu Mischa 2018-02-20 02:22:58

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/

-1
répondu Tuxedo Joe 2017-08-13 09:21:54