欢迎加入知了课堂,学习flask
Python Flask系列(1)——基础:http://study.163.com/course/courseMain.htm?courseId=1004091002
Python Flask框架——全栈开发: http://study.163.com/course/courseMain.htm?courseId=1004507006
考虑到模板代码的重用,Jinja2提供了块 (Block)和宏 (Macro)与包含(Include)的功能。下面对三种方法的使用进行介绍。
一、宏(Macro)
模板中的宏跟python中的函数类似,可以传递参数,但是不能有返回值,可以将一些经常用到的代码片段放到宏中,然后把一些不固定的值抽取出来当成一个变量。使用宏的时候,参数可以为默认值。
既然是函数,就有声明与调用两个部分
1.首先宏的定义
html
{% macro input(name="",value="",type="text") %}
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}
代码中,宏名就是 input ,后面三个参数和指定的默认值。
2.使用宏
html
<p>{{ input('username') }}</p>
<p>{{ input('password', type='password') }}</p>
我们可以看到一个输入文本框和一个密码框。
3.宏的导入
一个宏可以被不同的模板使用,所以我们建议将其声明在一个单独的模板文件中。
1. `import "宏文件的路径" as xxx`。
2. `from '宏文件的路径' import 宏的名字 [as xxx]`。
3. 宏文件路径,不要以相对路径去寻找,都要以`templates`作为绝对路径去找。
4. 如果想要在导入宏的时候,就把当前模版的一些参数传给宏所在的模版,那么就应该在导入的时候使用`with context`。示例:`from 'xxx.html' import input with context`。
二、块 (Block)
块功能有些类似于C语言中的宏,原理就是代码替换。在模板继承中,把一些公用的代码单独抽取出来放到一个父模板中。以后子模板直接继承就可以使用了。块 (Block)在模板继承中实现了语句块的替换,相当于父模板提供了一个接口,子模板根据接口实现具体细节部分。
1.在父模板中定义:
{% block block的名字 %}
{% endblock %}
2.通过 {% extends "base.html" %} 来声明继承
{% extends "base.html" %}
3.子模板继承:
{% block block的名字 %}
子模板中的代码
{% endblock %}
子模板中由”{% block block_name %}”和”{% endblock %}”所包括的语句块,将会替换父模板中同样由”{% block block_name %}”和”{% endblock %}”所包括的部分。
三、包含(Include)
其功能就是将另一个模板加载到当前模板中,并直接渲染在当前位置上。它同导入”import”不一样,”import”之后你还需要调用宏来渲染你的内容,”include”是直接将目标模板渲染出来。它同block块继承也不一样,它一次渲染整个模板文件内容,不分块。
方法{% include 'footer.html' %}
footer.html是你要包含的模板文件,等价于把文件里面的全部内容直接替换这个语句。
四、总结
块功能有些类似于C语言中的宏,原理就是代码替换;
宏的功能有些类似于函数,可以传入参数。
包含就是简单的复制粘贴。
参考文章:http://www.bjhee.com/jinja2-block-macro.html
欢迎加入知了课堂,学习flask
Python Flask系列(1)——基础:http://study.163.com/course/courseMain.htm?courseId=1004091002
Python Flask框架——全栈开发: http://study.163.com/course/courseMain.htm?courseId=1004507006