当前位置: 芃睿知识网 > 建站常见问题

jinja2 import 导入、include包含

时间:2021年10月23日 16:48   作者:知识网   出处:原创

1、import导入

Jinja2支持在宏中放置经常使用的代码。这些宏可以被导入,并不同的模板中使用。这与Python中的import语句类似。要知道的是,导入量会被缓存,并且默认下导入的模板不能访问当前模板中的非全局变量。

有两种方式来导入模板。你可以把整个模板导入到一个变量或从其中导入请求特定的宏/导出量。

{%macro input(name,value='',type='text')-%}
<input type="{{type}}"value="{{value|e}}"name="{{name}}">
{%-end macro%}
{%-macro textarea(name,value='',rows=10,cols=40)-%}
<textarea name="{{name}}"rows="{{rows}}"cols="{{cols
}}">{{value|e}}</textarea>

最简单灵活的方式是把整个模块导入为一个变量。这样你可以访问属性:

{%import 'forms.html' as forms%}
<dl>
<dt>Username</dt>
<dd>{{forms.input('username')}}</dd>
<dt>Password</dt>
<dd>{{forms.input('password',type='password')}}</dd>
</dl>
<p>{{forms.textarea('comment')}}</p>

此外你也可以从模板中导入名称到当前的命名空间:

{%from 'forms.html' import input as input_field,textarea%}
<dl>
<dt>Username</dt>
<dd>{{input_field('username')}}</dd>
<dt>Password</dt>
<dd>{{input_field('password',type='password')}}</dd>
</dl>
<p>{{textarea('comment')}}</p>

名称以一个或更多下划线开始的宏和变量是私有的,不能被导入。

Changedinversion2.4:如果传递一个模板对象到模板上下文,从那个对象中导入。

1.1、导入上下文行为

默认下,每个包含的模板会被传递到当前上下文,而导入的模板不会。这样做的原因是导入量不会像包含量被缓存,因为导入量经常只作容纳宏的模块。

无论如何,这当然也可以显式地更改。通过在import/include声明中直接添加withcontext或withoutcontext,当前的上下文可以传递到模板,而且不会自动禁用缓存。

这里有两个例子:

{%from 'forms.html' import input with context%}
{%include 'header.html' without context%}

提示:在Jinja2.0中,被传递到被包含模板的上下文不包含模板中定义的变量。事实上,这不能工作:

{%for box in boxes%}
{%include"render_box.html"%}
{%endfor%}

在Jinja2.0中,被包含的模板render_box.html不能访问box。从Jinja2.1开始,render_box.html可以这么做。

2.include包含

include语句用于包含一个模板,并在当前命名空间中返回那个文件的内容渲染结果:

{%include 'header.html' %}

Body

{%include 'footer.html' %}

被包含的模板默认可以访问活动的上下文中的变量。

从Jinja2.2开始,你可以把一句include用ignoremissing标记,这样如果模板不存在,Jinja会忽略这条语句。当与with或withoutcontext语句联合使用时,它必须被放在上下文可见性语句之前。

{%include "sidebar.html" ignore missing%}

{%include"sidebar.html" ignore missing with context%}

{%include"sidebar.html"ignore missing without context%}

Newinversion2.2.

你也可以提供一个模板列表,它会在包含前被检查是否存在。第一个存在的模板会被包含进来。如果给出了ignoremissing,且所有这些模板都不存在,会退化至不做任何渲染,否则将会抛出一个异常。

例子:

{%include['page_detailed.html','page.html']%}

{%include['special_sidebar.html','sidebar.html'] ignore missing%}

Changedinversion2.4:如果传递一个模板对象到模板上下文,你可以用include包含这个对象。

看了该文章的用户还看了

发表高见 (请对您的言行负责)
2021年10月18日 08:46,回答 by_淘气宝宝:
我个人include用的比较多,不过都没有加ignore missing,加上好像更友好一点。
©芃睿知识网 版权所有2021-2022 www.shsongjiang.com