Jak wyprowadzić loop.counter w szablonie Python Jinja?

169

Chcę mieć możliwość wyprowadzenia bieżącej iteracji pętli do mojego szablonu.

Zgodnie z dokumentacją: http://wsgiarea.pocoo.org/jinja/docs/loops.html , istnieje zmienna loop.counter, której próbuję użyć.

Mam:

<ul>
{% for user in userlist %}
  <li>
      {{ user }} {{loop.counter}}
  </li>
      {% if loop.counter == 1 %}
          This is the First user
      {% endif %}
{% endfor %}
</ul>

Chociaż nic nie jest wyświetlane w moim szablonie. Jaka jest prawidłowa składnia?

Rolando
źródło

Odpowiedzi:

376

Zmienna licznika wewnątrz pętli nazywa się loop.index w jinja2.

>>> from jinja2 import Template

>>> s = "{% for element in elements %}{{loop.index}} {% endfor %}"
>>> Template(s).render(elements=["a", "b", "c", "d"])
1 2 3 4

Więcej informacji można znaleźć pod adresem http://jinja.pocoo.org/docs/templates/ .

sigi
źródło
167
Warto wspomnieć, że jeśli chcesz mieć indeks oparty na 0, możesz loop.index0zamiast tego użyć .
ereOn
niesamowite jest to, że odniesienia do tego nie mogłem znaleźć na ich stronie internetowej, natomiast counter i counter0 są udokumentowane, ale nie ma ich w wersji, którą zainstalowałem wczoraj.
njzk2
42

Wewnątrz bloku pętli for można uzyskać dostęp do pewnych specjalnych zmiennych, w tym - loop.indexale nie loop.counter. Z oficjalnych dokumentów :

Variable    Description
loop.index  The current iteration of the loop. (1 indexed)
loop.index0 The current iteration of the loop. (0 indexed)
loop.revindex   The number of iterations from the end of the loop (1 indexed)
loop.revindex0  The number of iterations from the end of the loop (0 indexed)
loop.first  True if first iteration.
loop.last   True if last iteration.
loop.length The number of items in the sequence.
loop.cycle  A helper function to cycle between a list of sequences. See the explanation below.
loop.depth  Indicates how deep in a recursive loop the rendering currently is. Starts at level 1
loop.depth0 Indicates how deep in a recursive loop the rendering currently is. Starts at level 0
loop.previtem   The item from the previous iteration of the loop. Undefined during the first iteration.
loop.nextitem   The item from the following iteration of the loop. Undefined during the last iteration.
loop.changed(*val)  True if previously called with a different value (or not called at all).
tozCSS
źródło
15

jeśli używasz django, użyj forloop.counterzamiastloop.counter

<ul>
{% for user in userlist %}
  <li>
      {{ user }} {{forloop.counter}}
  </li>
      {% if forloop.counter == 1 %}
          This is the First user
      {% endif %}
{% endfor %}
</ul>
Daniel Butler
źródło