模板引入与继承
有时一些代码会在许多模板中重复用到,对于这些重复性的代码会将其抽取出来,就类似于Python中的函数一样,可以进行调用。而在模板中,这种调用方式一般有两种,分为局部引入和继承。
模板引入
实现局部引入,需使用include标签:
# header.html
<p>我是header</p>
# footer.html
<p>我是footer</p>
# main.html
{% include 'header.html' %}
<p>我是main内容</p>
{% include 'footer.html' %}
include标签寻找路径的方式,跟render渲染模板的函数是一样的。
include标签默认会自动的使用主模板中的上下文,也即可以自动的使用主模板中的变量。如果想传入一些其他的参数,那么可以使用 with
语句。
# header.html
<p>用户名:{{ username }}</p>
# main.html
{% include "header.html" with username='Rick' %}
模板继承
模板继承类似于Python中的类,在父类中可以先定义好一些变量和方法,然后在子类中实现。模板继承也可以在父模板中先定义好一些子模板需要用到的代码,然后子模板直接继承就可以了。
因为子模板也有自己的不同代码,此时可以在父模板中定义一个 block
接口,然后子模板再去实现。
"""base.html"""
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="{% static 'style.css' %}" />
<title>{% block title %}我的站点{% endblock %}</title>
</head>
<body>
<div id="sidebar">
{% block sidebar %}
<ul>
<li><a href="/">首页</a></li>
<li><a href="/blog/">博客</a></li>
</ul>
{% endblock %}
</div>
<div id="content">
{% block content %}
<h1>这是父类模板</h1>
{% endblock %}
</div>
</body>
</html>
父模板一般会取名 base.html
,定义好一个简单的html骨架,然后再根据需求定义好block接口,让子模板根据具体需求来实现。
子模板调用父模板时,需通过 extends
标签来实现:
{% extends "base.html" %}
{% block title %}
博客列表
{% endblock %}
{% block content %}
{% for entry in blog_entries %}
<h2>{{ entry.title }}</h2>
<p>{{ entry.body }}</p>
{% endfor %}
{# 调用父类模板 #}
{{ block.super }}
<h2>这是子模板</h2>
{% endblock %}
注意事项:
- extends标签必须放在模板的第一行;
- 子模板中的代码必须放在block中,否则不会被渲染;
- 如果在某个block中,需要调用父模板的内容,那么可以使用
{{ block.super }}
来继承。 - 在定义block的时候,除了在block开始的地方定义block的名字,还可以在block结束时定义名字。比如:
{% block title %}{% endblock title %}
,这在大型模板中显得尤为重要,能让开发者快速的看到block包含哪些部分。