How to increment a variable on a for loop in jinja template?

前端 未结 7 2058
旧时难觅i
旧时难觅i 2020-11-27 12:02

I would like to do something like:

variable p is from test.py which is a list [\'a\',\'b\',\'c\',\'d\']

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


        
相关标签:
7条回答
  • 2020-11-27 12:20

    Here's my solution:

    Put all the counters in a dictionary:

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

    Define a macro to increment them easily:

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

    Now, whenever you want to increment the 'counter1' counter, just do:

    {{ increment(counter, 'counter1') }}
    
    0 讨论(0)
  • 2020-11-27 12:23

    I was struggle with this behavior too. I wanted to change div class in jinja based on counter. I was surprised that pythonic way did not work. Following code was reseting my counter on each iteration, so I had only red class.

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

    I used loop.index like this and it works:

    {% 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 讨论(0)
  • 2020-11-27 12:26

    if anyone want to add a value inside loop then you can use this its working 100%

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

    output = 5

    0 讨论(0)
  • 2020-11-27 12:31

    After 2.10, to solve the scope problem, you can do something like this:

    {% set count = namespace(value=0) %}
    {% for i in p %}
      {{ count.value }}
      {% set count.value = count.value + 1 %}
    {% endfor %}
    
    0 讨论(0)
  • 2020-11-27 12:32

    You could use loop.index:

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

    Check the template designer documentation.

    In more recent versions, due to scoping rules, the following would not work:

    {% set count = 1 %}
    {% for i in p %}
      {{ count }}
      {% set count = count + 1 %}
    {% endfor %}
    
    0 讨论(0)
  • 2020-11-27 12:35

    Came searching for Django's way of doing this and found this post. Maybe someone else need the django solution who come here.

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

    Read more here: https://docs.djangoproject.com/en/1.11/ref/templates/builtins/

    0 讨论(0)
提交回复
热议问题