Django 模板(千字长文)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在 Web 开发中,Django 模板如同一座连接后端逻辑与前端展示的桥梁。它允许开发者通过简洁的语法,将 Python 数据动态渲染到 HTML 页面中,而无需直接操作复杂的原生代码。无论是编程初学者还是有一定经验的开发者,掌握 Django 模板的核心机制,都能显著提升开发效率并降低维护成本。本文将从基础语法到高级技巧,逐步解析其工作原理与应用场景,辅以具体案例帮助读者快速上手。


基础语法:变量与标签的初次相遇

Django 模板的核心是变量(Variables)和标签(Tags)。它们共同构成了动态渲染页面的基础。

变量:数据的“占位符”

变量用于在模板中引用后端传递的数据。其语法为双花括号 {{ }},例如:

<p>当前用户:{{ user.username }}</p>

若后端传递的 user 对象包含 username 属性,该变量会直接替换为对应的值。

比喻
变量就像是一个“快递盒”,后端将数据封装好后,模板通过变量名称直接拆开并展示内容。

标签:控制逻辑的“指令集”

标签以 {% %} 包裹,用于执行循环、条件判断等操作。例如:

{% if is_logged_in %}
  <p>欢迎回来!</p>
{% else %}
  <p>请登录</p>
{% endif %}

此示例根据 is_logged_in 的布尔值,动态渲染不同的 HTML 内容。


进阶技巧:逻辑控制与动态渲染

Django 模板的标签系统支持复杂的逻辑控制,让页面展示更灵活。

循环:遍历数据的“传送带”

通过 {% for %} 标签,可以循环遍历列表或字典:

<ul>
  {% for article in articles %}
    <li>{{ article.title }} - {{ article.author }}</li>
  {% empty %}
    <li>暂无文章</li>
  {% endfor %}
</ul>

此案例中,若 articles 列表为空,会触发 empty 分支显示默认信息。

条件判断:多路径的“交通灯”

除了基础的 if,还可以使用 elifelse 实现多条件分支:

{% if user.is_staff %}
  <a href="/admin/">管理后台</a>
{% elif user.is_authenticated %}
  <a href="/profile/">个人中心</a>
{% else %}
  <a href="/login/">登录</a>
{% endif %}

开发者可根据用户角色动态切换导航菜单。


模板继承:模块化的“积木拼装”

模板继承是 Django 中实现代码复用的核心机制,通过基模板(Base Template)与子模板(Child Template)的协作,减少重复代码。

基模板:构建页面骨架

创建一个 base.html,定义通用结构:

<!DOCTYPE html>
<html>
<head>
  <title>{% block title %}默认标题{% endblock %}</title>
</head>
<body>
  {% block content %}
    默认内容区域
  {% endblock %}
</body>
</html>

通过 {% block %} 标签定义可替换的“插槽”。

子模板:个性化内容填充

在子模板中继承基模板并覆盖相应块:

{% extends "base.html" %}
{% block title %}博客首页{% endblock %}
{% block content %}
  <h1>最新文章</h1>
  {% for post in posts %}
    <div>{{ post.title }}</div>
  {% endfor %}
{% endblock %}

子模板仅需关注差异部分,基模板的导航栏、页脚等元素会自动继承。


过滤器与自定义标签:数据的“变形金刚”

Django 模板提供了丰富的内置过滤器(Filters),用于在渲染时转换数据。例如:

<!-- 将字符串转为大写 -->
<p>{{ "hello world"|upper }}</p>  <!-- 输出:HELLO WORLD -->

<!-- 截取前 10 个字符 -->
<p>{{ long_text|truncatechars:10 }}</p>

开发者也可通过自定义标签扩展功能。例如,创建一个 highlight 过滤器,将特定关键词标红:

from django import template
register = template.Library()

@register.filter
def highlight(text, keyword):
    return text.replace(keyword, f'<span style="color:red">{keyword}</span>')

在模板中使用:

{{ article.content|highlight:"重要" }}

此功能可快速实现关键词高亮效果。


表单渲染:与用户的“对话窗口”

Django 模板配合表单类(Form),能高效生成交互式表单。例如用户注册表单:

<form method="POST">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">注册</button>
</form>

{{ form.as_p }} 会将表单字段自动渲染为 <p> 标签包裹的输入框,并包含错误提示。开发者还可通过模板控制样式:

<div class="form-group">
  {{ form.username.label_tag }}  
  {{ form.username }}  
  {% if form.username.errors %}
    <div class="error">{{ form.username.errors }}</div>
  {% endif %}
</div>

安全性:模板的“防护盾”

Django 模板默认对变量内容进行 HTML 转义,防止 XSS 攻击。例如:

<!-- 自动转义 -->
<p>{{ user_input }}</p>  <!-- 若输入包含 <script>,将被转义为文本 -->

若需渲染原始 HTML,可用 safe 过滤器:

<p>{{ content|safe }}</p>  <!-- 仅当内容可信时使用 -->

这一机制确保了模板的安全性,开发者需谨慎控制 safe 的使用场景。


实战案例:构建博客文章列表

以下是一个完整的博客列表页面开发流程:

后端准备

定义视图函数传递数据:

def blog_list(request):
    articles = Article.objects.all().order_by('-created_at')
    return render(request, 'blog/list.html', {'articles': articles})

模板实现

{% extends "base.html" %}
{% block content %}
<div class="blog-list">
  {% for article in articles %}
    <article>
      <h2>{{ article.title }}</h2>
      <div class="meta">
        作者:{{ article.author }} | 
        发布时间:{{ article.created_at|date:"Y-m-d" }}
      </div>
      <p>{{ article.content|truncatechars:200 }}</p>
      <a href="{% url 'article_detail' article.id %}">阅读更多</a>
    </article>
  {% empty %}
    <p>暂无文章,欢迎投稿!</p>
  {% endfor %}
</div>
{% endblock %}

此案例展示了循环、过滤器、URL 反向解析等模板功能的综合应用。


结论

Django 模板通过简洁的语法和强大的功能,成为构建动态网页的得力工具。从基础变量到模板继承,从逻辑控制到安全性保障,开发者能通过它高效实现复杂页面需求。对于初学者,建议从简单案例入手,逐步掌握标签与过滤器的组合技巧;中级开发者则可深入探索自定义标签与模板优化策略。掌握 Django 模板,不仅能提升开发效率,更能为构建大型 Web 应用奠定坚实基础。

实践建议:尝试用模板重构现有项目中的重复代码,或通过 Django 官方文档学习更多高级功能(如静态文件管理、模板标签编写),逐步完善自己的模板工具箱。

最新发布