Django 简明教程

Django - Add Master Template

Django 支持模板继承。Django 中继承的概念与面向对象编程中的继承非常相似。这个想法是,Web 应用程序中每个视图呈现的输出都必须遵循统一的格式或外观,即使每个视图可能呈现不同的模板。

假设一个 Django 应用程序有三个使用三个视图注册的 URL 路由。我们希望以这样的方式设计模板,即每个视图都应该有一个页眉、一个页脚以及一个带有链接的侧边栏和显示在其右侧的可变内容。

The Master Template

任何面向对象语言(例如 Python)中的 base class 定义属性和方法,并让继承类可以使用它们。同样,我们需要设计一个 master template ,为其他模板提供整体框架。

master template (有时称为“基模板”)连同通用结构也标记了虚拟块。子模板继承通用结构并覆盖这些块以提供各自的内容。这些块用 block – endblock 结构标记。

{% block block_name %}
   ...
   ...
{% endblock %}

主模板可能在不同位置包含多个此类块。每一个都应当提供一个唯一的标识符。

我们主模板( base.html )的 HTML 代码如下 −

<!doctype html>
<html>
<body>
   <!--header-->
   <div style="height:10%;">
      <h2 align="center">My Web Application</h2>
      <hr>
   </div>
   <div style="width:100%;">
      <!—side bar-->
      <div style="width:20%; float:left; border-right-style:groove">
         <ul>
            <b>
               <li><a href="">home</a></li>
               <li><a href="register/">register</a></li>
               <li><a href="login/">login</a></li>
            </b>
         </ul>
      </div>
      <!--contents-->
      <div style="margin-left:21%;">
         <p>
            {% block contents %}
            {% endblock %}
         </p>
      </div>
   </div>
   <br><br><br>
   <!--footer-->
   <hr>
   <div>
      <h4 align="right">All rights reserved</h4>
   </div>
</body>
</html>

主页的模板( index.html )通过标记继承了 base.html

{% extends "base.html" %}

它使用自己的内容填充虚拟内容块 −

<!doctype html>
<html>
<body>
   {% extends "base.html" %}
   {% block contents %}
      <h2 align="center">This is Home page</h2>
   {% endblock %}
</body>
</html>

Define a View

让我们定义一个呈现此模板的视图 −

from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
def index(request):
   return render(request, "index.html", {})

Register the View

我们还需在 urls.py 中注册该视图 −

urlpatterns = [
   ...,
   path('home/', views.index, name='home'),
]

当打开 http://localhost:8000/myapp/home URL 时,主页模板将使用 base.html 中设计的页眉、边栏和页脚进行渲染 −

django add master template