Search code examples
pythonjinja2template-inheritance

Jinja's loop variable is not available in include-d templates


I have code similar to the following in one of my jinja template

{% for post in posts %}
    {% include ["posts/" + post.type + ".html", "posts/default.html"] %}
{% endfor %}

which is supposed to render each post inside the posts collection, depending on the .type of the post. I have a different template setup for each post.type. And for those I don't have a template, it reverts to the default post template.

Now, I want the index of the post being displayed from bottom, inside the post templates, which is provided by loop.revindex. But for some reason, if I use loop.revindex inside the post template, I get a error saying UndefinedError: 'loop' is undefined.

So, is loop not available in the included templates? Is this by design? Am I doing something wrong with how I organised my templates for this to be not available?

Edit Okay, I came up with a workaround, in the for loop, before I include my template, I do

{% set post_index = loop.revindex %}

and use post_index inside the post template. Not ideal, but seems like the only way. I still want to know your solutions though.

Edit 2 One other thing, I am able to access the post variable inside the included template, but not the loop variable.


Solution

  • If might be possible with the {% with %} statement.

    Try this:

    {% with %}
        {% set loop_revindex = loop.revindex %}
        {% include ... %}
    {% endwith %}
    

    Instead of using loop.revindex in the included template, use loop_revindex.