Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 850
sharat87 Avatar asked Jan 11 '12 12:01

sharat87


2 Answers

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.

like image 188
Some programmer dude Avatar answered Nov 02 '22 15:11

Some programmer dude


Another option is to pass the entire loop variable into the included template by setting a local variable to loop

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

This gives you access to all of the loops properties, and, to me, makes it more clear in the included template what the variable is.

like image 2
spencerl Avatar answered Nov 02 '22 15:11

spencerl