考虑到模板代码的重用,Jinja2提供了块 (Block)和宏 (Macro)的功能。块功能有些类似于C语言中的宏,原理就是代码替换;而宏的功能有些类似于函数,可以传入参数。本篇我们就来介绍下块和宏的用法。
块 (Block)
我们在子模板的开头定义了”{% extend ‘parent.html’ %}”语句来声明继承,此后在子模板中由”{% block block_name %}”和”{% endblock %}”所包括的语句块,将会替换父模板中同样由”{% block block_name %}”和”{% endblock %}”所包括的部分。
这就是块的功能,模板语句的替换。这里要注意几个点:
模板不支持多继承,也就是子模板中定义的块,不可能同时被两个父模板替换。
模板中不能定义多个同名的块,子模板和父模板都不行,因为这样无法知道要替换哪一个部分的内容。
另外,我们建议在”endblock”关键字后也加上块名,比如”{% endblock block_name %}”。虽然对程序没什么作用,但是当有多个块嵌套时,可读性好很多。
保留父模板块的内容
如果父模板中的块里有内容不想被子模板替换怎么办?我们可以使用”super( )”方法。我们将父模板”layout.html”改为:
{% block head %}
{% block title %}{% endblock %}{% endblock %}
{% block body %}
{% endblock %}
1
2
3
4
5
6
7
8
9
10
11
12
13
{%blockhead%}
{%blocktitle%}{%endblock%}{%endblock%}
{%blockbody%}
{%endblock%}