- 应用背景:
Flask中的模板可以继承,通过继承可以把模板中许多重复出现的元素抽取出来,放在父模板中,并且父模板通过定义block给子模板开一个口,子模板根据需要,再实现这个block,假设现在有一个base.html这个父模板
通过include的方式只能是原封不动的继承,不能重写
同样,extends的方式不加其他内容也无法修改,需要在基类base.html中加入block
语法:
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="base.css" />
<title>{% block title %}{% endblock %}</title>
{% block head %}{% endblock %}
</head>
<body>
<div id="body">{% block body %}{% endblock %}</div>
<div id="footer">
{% block footer %}
© Copyright 2008 by <a href="http://domain.invalid/">you</a>
{% endblock %}
</div>
</body>
</html>
在以上代码中分别对title body 头部尾部进行了‘block’
以 <title>{% block titlem %}{% endblock %}</title>
为例,其中的titlem就是该block的名字
然后可以在demo文件中使用该block
相关代码:
python程序:
from flask import Flask,render_template
# 模板继承需要有一个基类的模板 base
app = Flask(__name__)
@app.route('/')
def extendsTest():
return render_template('demo.html')
if __name__ == '__main__':
app.run(debug=True)
基类HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!-- <block></block>-->
<!-- 通过block开一个口用于-->
<title>{% block title %}
title
{% endblock %}
</title>
</head>
<body>
{% block header%}
<ul>
<li>国际</li>
<li>军事</li>
<li>财经</li>
<li>娱乐</li>
</ul>
{% endblock %}
<!-- <h1>首页</h1>-->
{% block footer %}
<div class="footer">
这是网页尾部
</div>
{% endblock %}
</body>
</html>
导入基类的HTML
{% extends 'base.html' %}
{% block footer %}
<div class="footer">
这是尾部
</div>
{% endblock %}
{% block title %}
这是首页
{% endblock %}
注:能修改的是{% block %} {% endblock %}
之间的内容,没有被包裹的是无法修改的。
其他:
block可以进行嵌套吗?可以的
嵌套写法:
{% block footer %}
<div class="footer">
这是网页尾部
{% block foo %}
<div class="foo">
foo
</div>
{% endblock %}
</div>
{% endblock %}
但是嵌套定义的话,调用时也只能嵌套调用,如果在外部调用会报错,属于定义了重名的block
{% extends 'base.html' %}
{% block footer %}
<div class="footer">
这是尾部
{% block foo %}
<div class="foo">
f
</div>
{% endblock %}
</div>
{% endblock %}
如果在调用时直接通过
{% block foo %}
<div class="foo">
f
</div>
{% endblock %}
调用的话就会出问题。
嵌套部分完整代码:
bases.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!-- <block></block>-->
<!-- 通过block开一个口用于-->
<title>{% block title %}
title
{% endblock %}
</title>
</head>
<body>
{% block header%}
<ul>
<li>国际</li>
<li>军事</li>
<li>财经</li>
<li>娱乐</li>
</ul>
{% endblock %}
<!-- <h1>首页</h1>-->
{% block footer %}
<div class="footer">
这是网页尾部
{% block foo %}
<div class="foo">
foo
</div>
{% endblock %}
</div>
{% endblock %}
</body>
</html>
demo.html:
{% extends 'base.html' %}
{% block footer %}
<div class="footer">
这是尾部
{% block foo %}
<div class="foo">
f
</div>
{% endblock %}
</div>
{% endblock %}
{% block title %}
这是首页
{% endblock %}
<!--{% block foo %}-->
<!-- <div class="foo">-->
<!-- f-->
<!-- </div>-->
<!--{% endblock %}-->
注:在父模板没有定义的内容,在子模板中不能用
比如在demo.html中加入一行
<p>标签2</p>
实际并不能显示