当前位置: 知识网 > 建站问题

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包含这个对象。

很赞哦!(3)

发表高见 (请对您的言行负责)
2021年10月18日 08:46,回答 by_淘气宝宝:
我个人include用的比较多,不过都没有加ignore missing,加上好像更友好一点。

©芃睿知识网 版权所有 2012-2023 shsongjiang.com

备案号:赣ICP备2022001527号-1