119 votes

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

La sortie du résultat est :
1 2 3 4

204voto

zeekay Points 22640

Vous pourriez utiliser loop.index :

{% for i in p %}
  {{ loop.index }}
{% endfor %}

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

Dans les versions plus récentes, en raison des règles de scoping, les éléments suivants sont utilisés no travail :

{% set count = 1 %}
{% for i in p %}
  {{ count }}
  {% set count = count + 1 %}
{% endfor %}

6 votes

Utilisez ce réponse pour résoudre la question du cadrage

123voto

Après la version 2.10, pour résoudre le problème de la portée, vous pouvez faire quelque chose comme ceci :

{% set count = namespace(value=0) %}
{% for i in p %}
  {{ count.value }}
  {% set count.value = count.value + 1 %}
{% endfor %}

5 votes

J'obtiens l'erreur suivante : TemplateSyntaxError at /listing/ Invalid block tag on line 145 : 'set', expected 'endblock'. Avez-vous oublié d'enregistrer ou de charger cette balise ? Sur : {% set count = namespace(value=0) %} Une idée de la cause de ce problème ?

65voto

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

Vous pouvez éviter ce comportement en utilisant un objet plutôt qu'un scalaire pour 'count' :

{% set count = [1] %}

Vous pouvez maintenant manipuler count à l'intérieur d'une boucle for ou même d'un %include%. Voici comment j'incrémente count (oui, c'est un peu bizarre mais bon) :

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

Ou...

{% set count = [] %}
{% for something-that-loops %}
   {% set __ = count.append(1) %} 
   <div> Lorem ipsum meepzip dolor...
   {{ count|length }}
   </div>
{% endfor %}

(D'après les commentaires de @eyettea et @PYB)

20voto

Jahid Points 12756

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, quand vous voulez incrémenter le compteur 'counter1', il suffit de le faire :

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

0 votes

Une solution élégante à un problème compliqué. Merci !

0 votes

Très bien ! J'avais besoin d'un index de comptage cumulatif roulant sur deux boucles for imbriquées. Cela fonctionne très bien pour ce cas d'utilisation.

5voto

pratik soni Points 21

Si quelqu'un veut ajouter une valeur à l'intérieur d'une boucle, il peut utiliser ceci qui fonctionne à 100%.

{% set ftotal= {'total': 0} %} 
{%- for pe in payment_entry -%}
    {% if ftotal.update({'total': ftotal.total + 5}) %}{% endif %} 
{%- endfor -%}

{{ftotal.total}}

sortie = 5

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