如何将选定的命名parameter passing给Jinja2的包含上下文?

使用Django模板引擎我可以在使用命名参数设置自定义上下文时包含另一个部分模板,如下所示:

{% include "list.html" with articles=articles_list1 only %} {% include "list.html" with articles=articles_list2 only %} 

正如你可能以为, articles_list1articles_list2是两个不同的列表,但我可以重复使用将会使用articlesvariables的相同的list.html模板。

我试图用Jinja2来实现同样的function,但是我不明白推荐的方法,因为不支持with关键字。

Jinja2有一个可以使用with关键字的扩展名 – 它不会给你和Django相同的语法,它可能不会像你预期的那样工作,但你可以这样做:

 {% with articles=articles_list1 %} {% include "list.html" %} {% endwith %} {% with articles=articles_list2 %} {% include "list.html" %} {% endwith %} 

但是,如果list.html基本上只是作为创build列表的一种方式,那么您可能需要将其更改为一个macro – 这会给您更多的灵活性。

 {% 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) }} 

这样你就可以将多个variables传递给Jinja2 Include语句 – (通过在With语句中用逗号分隔variables):

  {% with var_1=123, var_2="value 2", var_3=500 %} {% include "your_template.html" %} {% endwith %} 

对于2017年以后的读者,金佳2.9默认包含with语句。 没有必要的扩展。

http://jinja.pocoo.org/docs/2.9/templates/#with-statement

在较早版本的Jinja(2.9之前)中,需要使用扩展来启用此function。 现在默认启用。