模板的导入和继承
在实际开发中,模板文件彼此之间可能会有大量冗余代码,为此django提供了专门的语法来解决这个问题,主要围绕三种标签的使用:include标签、extends标签、block标签,详解如下
1、模板的导入之include标签
功能类似于inclusion_tag
,但是没有inclusion_tag
灵活好用
{% include '模版名称' %}
案例:
可以把广告栏写到专门的文件里advertise.html
<div class="adv">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Panel title</h3>
</div>
<div class="panel-body">
Panel content
</div>
</div>
<div class="panel panel-danger">
<div class="panel-heading">
<h3 class="panel-title">Panel title</h3>
</div>
<div class="panel-body">
Panel content
</div>
</div>
<div class="panel panel-warning">
<div class="panel-heading">
<h3 class="panel-title">Panel title</h3>
</div>
<div class="panel-body">
Panel content
</div>
</div>
</div>
然后在base.html
文件中用include
标签引入advertise.html
文件的内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% include "advertise.html" %}
</body>
</html>
注意:include
导入,会将 html 文件内的所有内容全部导入,所以对于被导入的文件,不能是一个完整的 html 文件,不然导入文件之后,一个 html 文件可能出现两个<head>标签
2、模板的继承\派生之extends标签、block标签
extends可以搭配一个block标签,用于在继承的基础上定制新的内容
我们以先创建一个基本的“骨架”模版,它包含我们站点中的全部元素,并且可以定义多处blocks ,例如我们创建base.html
内容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
{% block title %}自定义title名{% endblock %}
</title>
</head>
<body>
<div>
{% block sidebar %}
<a href="#" class="list-group-item active">服装城</a>
<a href="#" class="list-group-item">美妆馆</a>
<a href="#" class="list-group-item">超市</a>
<a href="#" class="list-group-item">全球购</a>
<a href="#" class="list-group-item">闪购</a>
<a href="#" class="list-group-item">团购</a>
{% endblock %}
</div>
<div >
{% block content %}
base.html页面内容
{% endblock %}
</div>
</body>
</html>
模板base.html
定义了一个可以用于两列排版页面的简单HTML骨架。我们新建子模板index.html
的主要工作就是继承base.html
然后填充/覆盖其内部的blocks
。
{% extends "base.html" %}
<!--用新内容完全覆盖了父模板内容-->
{% block title %}
index页面
{% endblock %}
{% block sidebar %}
<!--该变量会将父模板中sidebar中原来的内容继承过来,然后我们可以在此基础上新增,否则就是纯粹地覆盖-->
{{ block.super }}
<!--在继承父模板内容的基础上新增的标签-->
<a href="#" class="list-group-item">拍卖</a>
<a href="#" class="list-group-item">金融</a>
{% endblock %}
{% block content %}
<!--用新内容完全覆盖了父模板内容-->
<p>index页面内容</p>
{% endblock %}
注意事项:
1、标签extends必须放在首行,base.html中block越多可定制性越强
2、include仅仅只是完全引用其他模板文件,而extends却可以搭配block在引用的基础上进行扩写
3、变量{{ block.super }} 可以重用父类的内容,然后在父类基础上增加新内容,而不是完全覆盖
4、为了提升可读性,我们可以给标签{% endblock %} 起一个名字
例如: {% block content %} … {% endblock content %}
5、在一个模版中不能出现重名的block标签