模板继承
在模板中,可能会遇到以下情况:
- 多个模板具有完全相同的顶部和底部内容
- 多个模板中具有相同的模板代码内容,但是内容中部分值不一样
- 多个模板中具有完全相同的 html 代码块内容
像遇到这种情况,可以使用 JinJa2 模板中的 继承 来进行实现
模板继承是为了重用模板中的公共内容。一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。
- 标签定义的内容
{% block top %} {% endblock %}
- 相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充。
- 子模板使用 extends 指令声明这个模板继承自哪个模板
- 父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()
视图代码:
from flask import Flask, render_template
app = Flask(__name__, template_folder='templates')
@app.route('/')
def index():
return render_template('index4.html')
if __name__ == '__main__':
app.run(debug=True)
父模板base.html内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}父级模板的内容{% endblock title %}</title>
{% block hander %}{% endblock hander %}
</head>
<body>
{% block content %}
<p>父级模板的content</p>
{% endblock content%}
</body>
{% block bottom %}
底部
{% endblock bottom %}
</html>
子模板index3.html内容:
{% extends 'base.html' %}
{% block title %} 来自子模板的标题{% endblock title %}
{% block hander %}
<script>
alert('你好呀,现在弹出的是子模板的内容')
</script>
{% endblock hander %}
super()
{% block content %}
{{ super() }}
<p>这是子模板的内容content</p>
{% endblock content %}
显示效果:
父级模板的content
这是子模板的内容
底部
模板继承使用时注意点:
-
不支持多继承
-
为了便于阅读,在子模板中使用extends时,尽量写在模板的第一行。
-
不能在一个模板文件中定义多个相同名字的block标签。
-
当在页面中使用多个block标签时,建议给结束标签起个名字,当多个block嵌套时,阅读性更好