19. Jinja2模板中的if
语句
if
条件判断语句必须放在
{% if statement %}
中间,并且还必须有结束的标签
{% endif %}
。和
python
中的类似,可以使用
>,<,<=,>=,==,!=
来进行判断,也可以通过
and,or,not,()
来进行逻辑合并操作。
{% if statement %}
{% elif statement %}
{% else %}
{% endif %}
20. Jinja2模板中的for
循环语句
在
jinja2
中的
for
循环,跟
python
中的
for
循环基本上是一模一样的。也是
for...in...
的形式。并且也可以遍历所有的序列以及迭代器。但是唯一不同的是,
jinja2
中的for
循环没有break
和continue
语句。
{% for statement %}
{% else %}
{% endfor %}
如果
for
语句里面不执行的时候,则运行else里面的语句
可以使用以下变量来获取当前遍历的状态:
变量 |
描述 |
loop.index |
当前迭代的索引(从1开始) |
loop.index0 |
当前迭代的索引(从0开始) |
loop.reindex |
反向 当前迭代的索引(从1开始) |
loop.reindex0 |
反向 当前迭代的索引(从0开始) |
loop.first |
是否第一次迭代,返回True或False |
loop.last |
是否是最后一次迭代,返回True或False |
loop.length |
序列的长度 |
21. 案例 - Jinja2实现九九乘法表
<table border="1">
<tbody>
{% for i in range(1, 10) %}
<tr>
{% for j in range(1, 10) if j < i %}
<td>{{ j }} * {{ i }} = {{ i*j }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
22. 宏的概念和基本使用方法
类似Python中的函数,可以传递参数,但是不能有返回值,可以将一些经常用到的代码片段放到宏中,然后把一些不固定的值抽取出来当成一个变量。
使用宏的时候,参数可以为默认值。相关示例代码如下:
- 定义宏:
html
{% macro input(name, value='', type='text') %}
<input type="{{ type }}" name="{{ name }}" value="{{
value }}">
{% endmacro %}
- 使用宏:
html
<p>{{ input('username') }}</p>
<p>{{ input('password', type='password') }}</p>
导入宏:
import "宏文件的路径" as xxx
。
from '宏文件的路径' import 宏的名字 [as xxx]
。
- 宏文件路径,不要以相对路径去寻找,都要以
templates
作为绝对路径去找。
- 如果想要在导入宏的时候,就把当前模版的一些参数传给宏所在的模版,那么就应该在导入的时候使用
with context
。示例:from 'xxx.html' import input with context
。
单独使用import时必须使用as给宏文件重命名。
引入templates目录下的文件路径时,均是相对templates的绝对路径。
宏文件无法获取从视图函数中传递的变量,若需要获取这些变量,则导入的时候应该加上
with context
from 'macros/macros.html' import input with context
23. include
标签
相当于把另外一个模板文件的内容复制粘贴过来。
1.html
<p>1. Hello World!</p>
{% include '2.html' %}
2.html
<p>2. Hello World!</p>
结果:
1. Hello World!
2. Hello World!
- 这个标签相当于是直接将指定的模版中的代码复制粘贴到当前位置。
include
标签,如果想要使用父模版中的变量,直接用就可以了,不需要使用with context
。
include
的路径,也是跟import
一样,直接从templates
根目录下去找,不要以相对路径去找。
24. set
和with
语句
set
设置全局变量,include调用的模板中也可以使用
{% set 变量=xxx %}
调用: {{ 变量 }}
with设置局部变量,变量生存周期仅局限于with代码块
{% with %}
{% set b= 5 %}
{{ b }}
{% endwith %}
超过变量生存区域就无法调用,jinja2最终渲染空白
25. 加载静态文件
静态文件: css js 图片 视频 字体等等。
加载静态文件使用的是
url_for
函数。然后第一个参数需要为
static
,第二个参数需要为一个关键字参数
filename='路径'
。示例:
```html
{{ url_for("static",filename='xxx') }}
```
路径查找,要以当前项目的
static
目录作为根目录。
如果要更改路径,可以参考之前修改templates文件夹
26. 模板继承
为什么需要模版继承:
模版继承可以把一些公用的代码单独抽取出来放到一个父模板中。以后子模板直接继承就可以使用了。这样可以重复性的代码,并且以后修改起来也比较方便。
模版继承语法:
使用
extends
语句,来指明继承的父模板。父模板的路径,也是相对于
templates
文件夹下的绝对路径。示例代码如下:
{% extends "base.html" %}
。
block语法:
一般在父模版中,定义一些公共的代码。子模板可能要根据具体的需求实现不同的代码。这时候父模版就应该有能力提供一个接口,让父模板来实现。从而实现具体业务需求的功能。
在父模板中:
{% block block的名字 %}
{% endblock %}
在子模板中:
{% block block的名字 %}
子模板中的代码
{% endblock %}
调用父模版代码block中的代码:
默认情况下,子模板如果实现了父模版定义的block。那么子模板block中的代码就会覆盖掉父模板中的代码。如果想要在子模板中仍然保持父模板中的代码,那么可以使用
{{ super() }}
来实现。示例如下:
父模板:
{% block body_block %}
<p style="background: red;">这是父模板中的代码</p>
{% endblock %}
子模板:
{% block body_block %}
{{ super() }}
<p style="background: green;">我是子模板中的代码</p>
{% endblock %}
可以使用
{{ super() }}
来继承父模板中的代码
调用另外一个block中的代码:
如果想要在另外一个模版中使用其他模版中的代码。那么可以通过
{{ self.其他block名字() }}
就可以了。示例代码如下:
{% block title %}
课堂首页
{% endblock %}
{% block body_block %}
{{ self.title() }}
<p style="background: green;">我是子模板中的代码</p>
{% endblock %}
其他注意事项:
- 子模板中的代码,第一行,应该是
extends
。
- 子模板中,如果要实现自己的代码,应该放到block中。如果放到其他地方,那么就不会被渲染。