Chciałbym zrobić coś takiego:
zmienna p pochodzi z test.py, która jest listą [„a”, „b”, „c”, „d”]
{% for i in p %}
{{variable++}}
{{variable}}
wynik to:
1 2 3 4
Chciałbym zrobić coś takiego:
zmienna p pochodzi z test.py, która jest listą [„a”, „b”, „c”, „d”]
{% for i in p %}
{{variable++}}
{{variable}}
wynik to:
1 2 3 4
Odpowiedzi:
Możesz użyć loop.index
:
{% for i in p %}
{{ loop.index }}
{% endfor %}
Sprawdź dokumentację projektanta szablonów .
W nowszych wersjach, ze względu na zasady określania zakresu, następujące elementy nie działałyby:
{% set count = 1 %}
{% for i in p %}
{{ count }}
{% set count = count + 1 %}
{% endfor %}
Po 2.10, aby rozwiązać problem z zakresem, możesz zrobić coś takiego:
{% set count = namespace(value=0) %}
{% for i in p %}
{{ count.value }}
{% set count.value = count.value + 1 %}
{% endfor %}
Jak mówi Jeroen, istnieją problemy z zasięgiem: jeśli ustawisz „count” poza pętlą, nie możesz go zmodyfikować wewnątrz pętli.
Możesz pokonać to zachowanie, używając obiektu zamiast skalara dla `` count '':
{% set count = [1] %}
Możesz teraz manipulować licznikiem wewnątrz pętli lub nawet% włączania%. Oto jak liczę przyrosty (tak, jest niezdarny, ale cóż):
{% if count.append(count.pop() + 1) %}{% endif %} {# increment count by 1 #}
{% set count = [] %}
, dodanie pozycji do listy w każdej pętli {% set __ = index.append(1) %}
i użycie długości do wyświetlenia indeksu index|length
.
{% set count = [ ] %}
, dodanie pozycji do listy w każdej pętli {% set __ = count.append(1) %}
i użycie długości do wyświetlenia liczbycount|length
Oto moje rozwiązanie:
Umieść wszystkie liczniki w słowniku:
{% set counter = {
'counter1': 0,
'counter2': 0,
'etc': 0,
} %}
Zdefiniuj makro, aby łatwo je zwiększyć:
{% macro increment(dct, key, inc=1)%}
{% if dct.update({key: dct[key] + inc}) %} {% endif %}
{% endmacro %}
Teraz, gdy chcesz zwiększyć licznik „counter1”, po prostu wykonaj:
{{ increment(counter, 'counter1') }}
Ja też walczyłem z tym zachowaniem. Chciałem zmienić klasę div w jinja na podstawie licznika. Byłem zaskoczony, że sposób pythonowy nie działa. Poniższy kod resetował mój licznik po każdej iteracji, więc miałem tylko czerwoną klasę.
{% 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 %}
Użyłem loop.index w ten sposób i działa:
{% 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 %}
jeśli ktoś chce dodać wartość wewnątrz pętli, możesz to wykorzystać w 100%
{% set ftotal= {'total': 0} %}
{%- for pe in payment_entry -%}
{% if ftotal.update({'total': ftotal.total + 5}) %}{% endif %}
{%- endfor -%}
{{ftotal.total}}
wyjście = 5
Zacząłem szukać sposobu, w jaki Django to robi i znalazłem ten post. Może ktoś inny potrzebuje rozwiązania django, który tu przyjechał.
{% for item in item_list %}
{{ forloop.counter }} {# starting index 1 #}
{{ forloop.counter0 }} {# starting index 0 #}
{# do your stuff #}
{% endfor %}
Przeczytaj więcej tutaj: https://docs.djangoproject.com/en/1.11/ref/templates/builtins/