View 办完业务,不一定直接回纯文本。
大多数页面型项目,接下来会进入 Template,也就是公文排版室。
先做一个基础模板:
<!-- templates/base.html -->
<!doctype html>
<html lang="zh-Hans">
<head>
<meta charset="utf-8">
<title>{% block title %}中央行政城区{% endblock %}</title>
</head>
<body>
<header>
<h1>中央行政城区</h1>
<nav>
<a href="{% url 'permits:index' %}">许可证大厅</a>
</nav>
</header>
<main>
{% block content %}{% endblock %}
</main>
</body>
</html>列表页继承它:
<!-- templates/permits/index.html -->
{% extends "base.html" %}
{% block title %}许可证列表{% endblock %}
{% block content %}
<h2>最新申请</h2>
<ul>
{% for permit in permits %}
<li>
<a href="{% url 'permits:detail' permit.pk %}">
{{ permit.title }} - {{ permit.get_status_display }}
</a>
</li>
{% empty %}
<li>暂无申请</li>
{% endfor %}
</ul>
{% endblock %}这就是 Django 模板最舒服的地方:
extends做公文总版式block给子页面留空位for/if做轻逻辑展示{% url %}不硬编码路径- 自动 HTML 转义,默认更安全
模板继承关系图:
base.html
│
├── permits/index.html
├── permits/detail.html
└── registration/login.html一条很硬的工程纪律:
模板负责展示,不负责做重业务计算。
不要在模板里堆复杂判断、数据库访问想象、巨型嵌套逻辑。公文排版室的职责,是把窗口已经准备好的内容排出来,不是替窗口重新办一遍事。
顺手再记一个事实:
- Django 可以很好地渲染 HTML
- 但 View 也可以完全不走模板,直接返回 JSON、文件、重定向
所以 Template 是强能力,不是强绑定。