How to Output Loop. Counter in Python Jinja Template?
I Want to Be Able to Output the Current Loop Iteration to My Template. According to the Docs, There Is a Loop. Counter Variable That I Am Trying to Use: {% for...
I want to be able to output the current loop iteration to my template.
According to the docs, there is a loop.counter variable that I am trying to use:
<ul>
{% for user in userlist %}
<li>
{{ user }} {{loop.counter}}
</li>
{% if loop.counter == 1 %}
This is the First user
{% endif %}
{% endfor %}
</ul>
But is being outputed to my template. What is the correct syntax?
5 Answers
The counter variable inside the loop is called loop.index in 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
In addition to loop.index, there is also
loop.index0(index starting at0)loop.revindex(reverse index; ending at1)loop.revindex0(reverse index; ending at0)- Even more at .
Inside of a for-loop block, you can access some special variables, such as loop.index (but not loop.counter). From the official docs:
| 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. |
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). |
If you are using Django, use forloop.counter instead of loop.counter:
<ul>
{% for user in userlist %}
<li>
{{ user }} {{forloop.counter}}
</li>
{% if forloop.counter == 1 %}
This is the First user
{% endif %}
{% endfor %}
</ul>
Real-life example:
{% for image in item['images'] %}
{% set image_id = item_id ~ '-preview-' ~ loop.index0 %}
<div id="{{ image_id }}" class="overlay">
<a class="cancel" href="#{{ item_id }}"></a>
<div class="popup">
{% set src = image if image.startswith('http') else '/static/images/store/' ~ item_id ~ '/' ~ image %}
<a href="{{ src }}"><img class="modal-img" src="{{ src }}"/></a>
</div>
</div>
{% endfor %}
In your Python code:
env = Environment(loader=FileSystemLoader("templates"))
env.globals["enumerate"] = enumerate
In your template:
{% for idx, val in enumerate(list) %}
{{ idx }}. {{val}}
{% endfor %}