1. 宏
Jinja2中的宏和python中的函数类似,可以传递参数,但是不能有返回值,我们可以将一些常用的代码放到宏中,然后把一些不固定的值抽取出来当成一个变量。我们在模板中写入这样一个宏。
{% macro input(name, value='', type='text') %}
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}
创建一个宏我们需要使用到{% macro %}
语句,上面我们就创建了一个名字叫做input
的宏,并且指定了一些默认参数,我们以后想要input
语句的时候,也可以像下面这样使用:
{{ input('username') }}
{{ input('password',type='password') }}
{{ input('username',value='xxx') }}
注意:
- 先定义,在使用:宏一定要先定义了,才能够使用,否则将就会出现
jinja2.exceptions.UndefinedError
的错误。
2. import语句
一般在真实的项目开发中,我们都会将一些常用的宏单独的放在一个文件中,在需要使用的时候,在从这个文件中进行导入。import语句的用法跟python中的import类似,可以直接import...as...
,也可以from...import...
或者from...import...as...
我们新建一个macros.html
的文件,然后我们在里面定义两个宏。
{% macro input(name, value='', type='text') %}
<input type="{{ type }}" value="{{ value }}" name="{{ name }}">
{% endmacro %}
{% macro textarea(name, value='', rows=10, cols=40) %}
<textarea name="{{ name }}" rows="{{ rows }}" cols="{{ cols }}">{{ value }</textarea>
{% endmacro %}
然后我们就可以在另外一个模板文件中导入这些宏。
import ... as ...
形式:
{% import 'macros.html' as macros %}
<dl>
<dt>Username</dt>
<dd>{{ macros.input('username') }}</dd>
<dt>Password</dt>
<dd>{{ macros.input('password', type='password') }}</dd>
</dl>
<p>{{ forms.textarea('comment') }}</p>
from...import...as.../form ... import ...
形式
{% from 'macros.html' import input as input_field, textarea %}
<!-- 给input取了一个别名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>
3. {% set %}语句
有时候我们想要在模板中添加变量,这个时候我们就可以使用{% set %}语句了。
{% set username='xxx' %}
那么在这个模板中,我们就可以直接使用这个变量了,和python中一样的用法.
我们也可以赋值为列表或元祖。
{% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %}
在这个模板中我们就可以直接{{变量}}
这样使用了。在这里就是{{ username }}
,{{ navigation }}
这种方式赋值是在整个模板中都有效,如果我们不想在整个模板中都有效,怕污染全局变量,只是想在某一部分使用这个变量,那么我们就可以使用{% with %}
语句了。
4. {% with %}语句
{% with %}
{% set foo = 42 %}
{{ foo }}
{% endwith %}
这样,{{ foo }}
这个变量只在{% with %}
这个模块中有用。出了这个模块,那么就得不到{{ foo }}这个变量了。
上面的那种写法我们也可以换成下面这样。
{% with foo = 42 %}
{{ foo }}
{% endwith %}
这两种写法是等价的,具体使用哪种方式就看心情吧…