web-dev-qa-db-fra.com

Comment incrémenter une variable sur une boucle for dans un 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}}

le résultat obtenu est: 1 2 3 4

56
user422100

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

Consultez la documentation du concepteur template .

111
zeekay

Comme Jeroen le dit, il y a des problèmes de portée: si vous définissez 'nombre' en dehors de la boucle, vous ne pouvez pas le modifier à l'intérieur de la boucle. 

Vous pouvez vaincre ce problème en utilisant un objet plutôt qu'un scalaire pour 'count':

{% set count = [1] %}

Vous pouvez maintenant manipuler le compte dans une boucle ou même un% include%. Voici comment j'incrémente (oui, c'est compliqué mais bon):

{% if count.append(count.pop() + 1) %}{% endif %} {# increment count by 1 #}
45
Peter Hollingsworth

Après 2.10, pour résoudre le problème de la 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 %}
15

Voici ma solution:

Mettez tous les compteurs dans un dictionnaire:

{% set counter = {
    'counter1': 0,
    'counter2': 0,
    'etc': 0,
    } %}

Définissez une macro pour les 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 'compteur1', faites simplement:

{{ increment(counter, 'counter1') }}
10
Jahid

Entré à la recherche de la manière de Django de faire cela et 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 %}

Lisez plus ici: https://docs.djangoproject.com/fr/1.11.11/ref/templates/builtins/

0
Tuxedo Joe

J'ai eu du mal avec ce comportement aussi. Je voulais changer de classe div en jinja en fonction de counter. J'ai été surpris que Pythonic ne fonctionne pas. Le code suivant remettait 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é loop.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
Mischa