while for español ejemplos ciclo bucle anidado acumulador python jinja2

python - español - ¿Cómo incrementar una variable en un bucle for en la plantilla de jinja?



for i in range python español (6)

Como dice Jeroen, hay problemas de alcance: si configura ''conteo'' fuera del ciclo, no puede modificarlo dentro del ciclo.

Puede vencer este comportamiento utilizando un objeto en lugar de un escalar para ''contar'':

{% set count = [1] %}

Ahora puede manipular el recuento dentro de un forloop o incluso un% include%. Así es como incremente la cuenta (sí, es kludgy pero bueno):

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

Me gustaría hacer algo como:

La variable p es de test.py que es una lista [''a'', ''b'', ''c'', ''d'']

{% for i in p %} {{variable++}} {{variable}}

resultado resultado es: 1 2 3 4


Después de 2.10, para resolver el problema de alcance, puede hacer algo como esto:

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


Puede usar set para incrementar un contador:

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

O podría usar loop.index :

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

Verifique la documentación del diseñador de la plantilla .


También tuve problemas con este comportamiento. Quería cambiar la clase div en jinja en base al contador. Me sorprendió que la forma pitonica no funcionara. El siguiente código restablecía mi contador en cada iteración, así que solo tenía la clase roja.

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

Utilicé loop.index así y funciona:

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


Vine en busca de la forma de hacer esto de Django y encontré esta publicación. Quizás alguien más necesite la solución django que viene aquí.

{% for item in item_list %} {{ forloop.counter }} {# starting index 1 #} {{ forloop.counter0 }} {# starting index 0 #} {# do your stuff #} {% endfor %}

Lea más aquí: https://docs.djangoproject.com/en/1.11/ref/templates/builtins/


Aquí está mi solución:

Pon todos los contadores en un diccionario:

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

Defina una macro para incrementarla fácilmente:

{% macro increment(dct, key, inc=1)%} {% if dct.update({key: dct[key] + inc}) %} {% endif %} {% endmacro %}

Ahora, cuando quiera incrementar el contador ''contador1'', simplemente haga lo siguiente:

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