模板引入与继承

有时一些代码会在许多模板中重复用到,对于这些重复性的代码会将其抽取出来,就类似于Python中的函数一样,可以进行调用。而在模板中,这种调用方式一般有两种,分为局部引入和继承。

模板引入

实现局部引入,需使用include标签:

  1. # header.html
  2. <p>我是header</p>
  3. # footer.html
  4. <p>我是footer</p>
  5. # main.html
  6. {% include 'header.html' %}
  7. <p>我是main内容</p>
  8. {% include 'footer.html' %}

include标签寻找路径的方式,跟render渲染模板的函数是一样的。

include标签默认会自动的使用主模板中的上下文,也即可以自动的使用主模板中的变量。如果想传入一些其他的参数,那么可以使用 with 语句。

  1. # header.html
  2. <p>用户名:{{ username }}</p>
  3. # main.html
  4. {% include "header.html" with username='Rick' %}

模板继承

模板继承类似于Python中的类,在父类中可以先定义好一些变量和方法,然后在子类中实现。模板继承也可以在父模板中先定义好一些子模板需要用到的代码,然后子模板直接继承就可以了。

因为子模板也有自己的不同代码,此时可以在父模板中定义一个 block 接口,然后子模板再去实现。

  1. """base.html"""
  2. {% load static %}
  3. <!DOCTYPE html>
  4. <html lang="en">
  5. <head>
  6. <link rel="stylesheet" href="{% static 'style.css' %}" />
  7. <title>{% block title %}我的站点{% endblock %}</title>
  8. </head>
  9. <body>
  10. <div id="sidebar">
  11. {% block sidebar %}
  12. <ul>
  13. <li><a href="/">首页</a></li>
  14. <li><a href="/blog/">博客</a></li>
  15. </ul>
  16. {% endblock %}
  17. </div>
  18. <div id="content">
  19. {% block content %}
  20. <h1>这是父类模板</h1>
  21. {% endblock %}
  22. </div>
  23. </body>
  24. </html>

父模板一般会取名 base.html ,定义好一个简单的html骨架,然后再根据需求定义好block接口,让子模板根据具体需求来实现。

子模板调用父模板时,需通过 extends 标签来实现:

  1. {% extends "base.html" %}
  2. {% block title %}
  3. 博客列表
  4. {% endblock %}
  5. {% block content %}
  6. {% for entry in blog_entries %}
  7. <h2>{{ entry.title }}</h2>
  8. <p>{{ entry.body }}</p>
  9. {% endfor %}
  10. {# 调用父类模板 #}
  11. {{ block.super }}
  12. <h2>这是子模板</h2>
  13. {% endblock %}

注意事项:

  1. extends标签必须放在模板的第一行;
  2. 子模板中的代码必须放在block中,否则不会被渲染;
  3. 如果在某个block中,需要调用父模板的内容,那么可以使用 {{ block.super }} 来继承。
  4. 在定义block的时候,除了在block开始的地方定义block的名字,还可以在block结束时定义名字。比如: {% block title %}{% endblock title %} ,这在大型模板中显得尤为重要,能让开发者快速的看到block包含哪些部分。