¿Cómo generar loop.counter en la plantilla python jinja?

167

Quiero poder generar la iteración de bucle actual en mi plantilla.

Según los documentos: http://wsgiarea.pocoo.org/jinja/docs/loops.html , hay una variable loop.counter que estoy tratando de usar.

Tengo lo siguiente:

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

Aunque no se está enviando nada a mi plantilla. ¿Cual es la sintaxis correcta?

Rolando
fuente

Respuestas:

374

La variable de contador dentro del bucle se llama loop.index en 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

Ver http://jinja.pocoo.org/docs/templates/ para más información.

sigi
fuente
166
Vale la pena mencionar que si desea un índice basado en 0, puede usarlo loop.index0en su lugar.
antes del
Lo que es totalmente sorprendente es que la referencia a esto no la pude encontrar en su sitio web, mientras que counter y counter0 están documentados pero no están presentes en la versión que instalé ayer.
njzk2
42

Dentro de un bloque for-loop, puede acceder a algunas variables especiales que incluyen loop.index--pero no loop.counter. De los documentos oficiales :

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
fuente
14

si está utilizando django use en forloop.counterlugar deloop.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
fuente