宏
模板中的宏跟python中的函数类似,可以传递参数,但是不能有返回值,可以将一些经常用到的代码片段放到宏中,然后把一些不固定的值抽取出来当成一个变量
{% macro input(name, value='', type='text') %}
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}
以上例子可以抽取出了一个input标签,指定了一些默认参数。那么我们以后创建input标签的时候,可以通过他快速的创建:
<p>{{ input('username') }}</p>
<p>{{ input('password', type='password') }}</p>
import语句
在真实的开发中,会将一些常用的宏单独放在一个文件中,在需要使用的时候,再从这个文件中进行导入。import语句的用法跟python中的import类似,可以直接import…as…,也可以from…import…或者from…import…as…,假设现在有一个文件,叫做forms.html,里面有两个宏分别为input和textarea
forms.html:
{% macro input(name, value='', type='text') %}
<input type="{{ type }}" value="{{ value|e }}" name="{{ name }}">
{% endmacro %}
{% macro textarea(name, value='', rows=10, cols=40) %}
<textarea name="{{ name }}" rows="{{ rows }}" cols="{{ cols
}}">{{ value|e }}</textarea>
{% endmacro %}
通过import导入宏
1.import…as…形式
{% import 'macro.html' as macro %}
<tr>
<td>用户名:</td>
<td>{{ macro.input('username') }}</td>
</tr>
2.from…import…as…/from…import…形式
{% from "macro.html" import input %}
<tr>
<td>密码:</td>
<td>{{ input("password",type="password") }}</td>
</tr>
另外需要注意的是,导入模板并不会把当前上下文中的变量添加到被导入的模板中,如果你想要导入一个需要访问当前上下文变量的宏,有两种可能的方法
- 显式地传入请求或请求对象的属性作为宏的参数
- 与上下文一起(with context)导入宏
与上下文中一起(with context)导入的方式
{% import 'macro.html' as macro with context %}
include语句
include语句可以把一个模板引入到另外一个模板中,类似于把一个模板的代码copy到另外一个模板的指定位置
比如在一个网页中,有时不管中间的怎么变化,这个网页的最上面的部分和最下面的部分是一样的,这时如果我们只是在每个网页中的头部和尾部加上相同的代码就显得我们很呆,这时我们可以使用include
{% include 'header.html' %}
主体内容
{% include 'footer.html' %}
赋值(set)语句
有时候我们想在在模板中添加变量,这时候赋值语句(set)就派上用场了
{% set name='dog' %}
那么以后就可以使用name来代替dog这个值了,同时,也可以给他赋值为列表和元组:
{% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %}
赋值语句创建的变量在其之后都是有效的,如果不想让一个变量污染全局环境,可以使用with语句来创建一个内部的作用域,将set语句放在其中,这样创建的变量只在with代码块中才有效
{% with %}
{% set foo = 42 %}
{{ foo }} foo is 42 here
{% endwith %}
也可以在with的后面直接添加变量,比如以上的写法可以修改成这样:
{% with foo = 42 %}
{{ foo }}
{% endwith %}
这两种方式都是等价的,一旦超出with代码块,就不能再使用foo这个变量了。