模板引入与继承
有时一些代码会在许多模板中重复用到,对于这些重复性的代码会将其抽取出来,就类似于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包含哪些部分。
