How to pass selected, named arguments to Jinja2's include context?
Using Django templating engine I can include another partial template while setting a custom context using named arguments, like this:
{% include "list.html" with articles=articles_list1 only %}
{% include "list.html" with articles=articles_list2 only %}
As you may be supposing, articles_list1
and articles_list2
are two different lists, but I can reuse the very same list.html
template which will be using the articles
variable.
I'm trying to achieve the same thing using Jinja2, but I can't see what's the recommended way, as the with
keyword is not supported.
Solution 1:
Jinja2 has an extension that enables the with
keyword - it won't give you the same syntax as Django, and it may not work the way you anticipate but you could do this:
{% with articles=articles_list1 %}
{% include "list.html" %}
{% endwith %}
{% with articles=articles_list2 %}
{% include "list.html" %}
{% endwith %}
However, if list.html
is basically just functioning as a way to create a list then you might want to change it to a macro
instead - this will give you much more flexibility.
{% macro build_list(articles) %}
<ul>
{% for art in articles %}
<li>{{art}}</li>
{% endfor %}
</ul>
{% endmacro %}
{# And you call it thusly #}
{{ build_list(articles_list1) }}
{{ build_list(articles_list2) }}
To use this macro from another template, import it:
{% from "build_list_macro_def.html" import build_list %}
Solution 2:
This way you can pass multiple variables to Jinja2 Include statement - (by splitting variables by comma inside With statement):
{% with var_1=123, var_2="value 2", var_3=500 %}
{% include "your_template.html" %}
{% endwith %}
Solution 3:
For readers in 2017+, Jinja as of 2.9
includes the with
statement by default. No extension necessary.
http://jinja.pocoo.org/docs/2.9/templates/#with-statement
In older versions of Jinja (before 2.9) it was required to enable this feature with an extension. It’s now enabled by default.