知识网2021年10月23日 16:48原创
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可以这么做。
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)
©芃睿知识网 版权所有 2012-2023 shsongjiang.com
版权申明:本站部分文章来自互联网,如有侵权,请联系邮箱xiajingzpy@163.com,我们会及时处理和回复!