模板继承:和Python中类的继承是相似的,典型应用是网站开头或者网站结尾。
父模板:如果一段代码重复出现,为了效率,通常会把这段代码定义到模板中,这个模板就是父模板。父模板定义在templates目录下。
子模板:需要继承父模板格式的模板,定义在templates/应用目录下。
模板继承中使用block标签,格式:
{% block 名称 %}
预留区域,可以编写默认内容,也可以没有默认内容
{% endblock 名称 %}
为了更好的可读性,建议block和endblock写上相同名称。
父模板代码:base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% block top %}
<h1>这是网页头部</h1>
{% endblock top%}
{% block content1 %}
<div>这是个牛逼的网站</div>
{% endblock content1%}
{% block content2 %}
{# 预留区域 #}
{% endblock content2%}
{% block bottom %}
<h1>这是网页尾部</h1>
{% endblock bottom%}
</body>
</html>
子模板:jicheng.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% extends 'base.html' %}
{% block top1 %}
<h1>呵呵呵呵呵呵</h1>
{% endblock top1%}
{% block content2 %}
<ul>
{% for bookinfo in bookinfos %}
<li>{{ bookinfo.name }}</li>
{% endfor %}
</ul>
{% endblock content2%}
</body>
</html>
结果:
这是网页头部
这是个牛逼的网站
射雕英雄传
天龙八部
笑傲江湖
雪山飞狐
这是网页尾部
1.子模板需要继承父模板{% extends 'base.html' %}。
2.子模板继承父模板之后,子模板原先的内容不显示,子模板里面的“呵呵呵呵”就没有显示。
也就是说子模板只能去修改父模板里的内容来自定义显示。
3.子模板可以重写名称相同的block模块,显示的是子模板重写之后的内容。
4.子模板会继承父模板的所有block模块,未重写的block模块都会显示。
5.父模板不会把上下文传给子模板,子模板只继承内容,不继承上下文。
6.如果在子模板的视图中加入了上下文,那么只有放到模块内才会显示。
视图:
def jicheng(request):
bookinfos = BookInfo.objects.all()
name = {'age':'18'}
context = {
'bookinfos': bookinfos,
'name':name
}
return render(request, 'temp/jicheng.html', context)
子模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% extends 'base.html' %}
{{ name.age }}
{% block top %}
<h1>呵呵呵呵呵呵{{ name.age }}</h1>
{% endblock top%}
{% block content2 %}
<ul>
{% for bookinfo in bookinfos %}
<li>{{ bookinfo.name }}</li>
{% endfor %}
</ul>
{% endblock content2%}
</body>
</html>
结果:
呵呵呵呵呵呵18
这是个牛逼的网站
射雕英雄传
天龙八部
笑傲江湖
雪山飞狐
这是网页尾部
总结:
请注意,我把子模板的top1模块名字改为了和父模板一样的top,等于重写了父模板的方法,name.age 一共写了两个地方,只有一个显示,其实这个和上面说到的一样,子模板自身的内容不会显示,但是如果需要显示子模板视图中的上下文,
就需要把属性写到和父模板block名称相同的模块里面。