Django模板系统核心语法详解:条件、循环与继承

纸上星河
纸上星河
发布时间:2026-10-13| 4人浏览过
原创

本文详细介绍Django框架中模板系统的核心用法,涵盖if/else条件判断、for循环迭代、ifequal比较、注释语法及各类内置过滤器。重点解析模板继承机制,通过base.html与子模板的block标签配合,实现页面布局复用与局部覆盖,帮助开发者掌握Django视图渲染的关键技术。

本文详细介绍Django框架中模板系统的具体应用方法,旨在为读者提供实用的参考指南。

Django 模板标签基础

Django 模板标签

if/else 标签

其基本语法结构如下所示:


{% if condition %}
   ... display
{% endif %}

或者采用以下形式:


{% if condition1 %}
  ... display 1
{% elif condition2 %}
  ... display 2
{% else %}
  ... display 3
{% endif %}

该标签用于根据条件判断是否渲染输出内容,且支持多层嵌套使用。

{% if %} 标签支持 and、or 以及 not 关键字,用于对多个变量进行逻辑判断或对变量取反(not),具体示例如下:


{% if athlete_list and coach_list %}
   athletes 和 coaches 变量都是可用的。
{% endif %}

for 循环迭代语法

for 标签

{% for %} 标签允许开发者遍历序列数据。

其语法结构与 Python 的 for 语句类似,格式为 for X in Y,其中 Y 代表需要迭代的序列,X 代表在每次循环中使用的变量名。

在每一次循环过程中,模板系统会渲染位于 {% for %} 和 {% endfor %} 之间的所有代码内容。

例如,假设存在一个名为 athlete_list 的运动员列表变量,可以使用以下代码来展示该列表:


<ul>
{% for athlete in athlete_list %}
  <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

若需反向迭代列表,可在标签中添加 reversed 参数:


{% for athlete in athlete_list reversed %}
...
{% endfor %}

{% for %} 标签支持嵌套使用:


{% for athlete in athlete_list %}
  <h1>{{ athlete.name }}</h1>
  <ul>
  {% for sport in athlete.sports_played %}
    <li>{{ sport }}</li>
  {% endfor %}
  </ul>
{% endfor %}

ifequal 值比较标签

ifequal/ifnotequal 标签

{% ifequal %} 标签用于比较两个值,当两者相等时,渲染并输出 {% ifequal %} 与 {% endifequal %} 之间的所有内容。

以下示例展示了比较两个模板变量 user 和 currentuser 的情况:


{% ifequal user currentuser %}
  <h1>Welcome!</h1>
{% endifequal %}

与 {% if %} 类似,{% ifequal %} 也支持可选的 {% else %} 标签:8


{% ifequal section 'sitenews' %}
  <h1>Site News</h1>
{% else %}
  <h1>No News Here</h1>
{% endifequal %}

注释与过滤器用法

注释标签

Django 模板中的注释语法为 {# #}。


{# 这是一个注释 #}

过滤器

模板过滤器可在变量显示前对其进行修改,过滤器的使用方式为管道符号,示例如下:


{{ name|lower }}

{{ name }} 变量经过 lower 过滤器处理后,会将文本转换为小写。

过滤器管道支持串联操作,即前一个过滤器的输出可作为下一个过滤器的输入:


{{ my_list|first|upper }}

上述实例将列表的第一个元素提取出来,并将其转换为大写。

部分过滤器包含参数。过滤器参数位于冒号之后,且必须用双引号包裹。例如:


{{ bio|truncatewords:"30" }}

此示例将显示变量 bio 的前30个单词。

其他常用过滤器包括:

  • addslashes:在反斜杠、单引号或双引号前添加反斜杠进行转义。
  • date:按指定的格式字符串参数格式化 date 或 datetime 对象,实例如下:

{{ pub_date|date:"F j, Y" }}

  • length:返回变量的长度。

模板包含与继承机制

include 标签

{% include %} 标签允许在模板中引入其他模板的内容。

以下示例展示了如何包含 nav.html 模板:


{% include "nav.html" %}

模板继承

模板可以通过继承机制实现代码复用。

接下来,我们在之前项目的 templates 目录中创建 base.html 文件,代码如下:


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
  <h1>Hello World!</h1>
  <p>菜鸟教程 Django 测试。</p>
  {% block mainbody %}
    <p>original</p>
  {% endblock %}
</body>
</html>

上述代码中,名为 mainbody 的 block 标签是可以被子模板替换的部分。

所有的 {% block %} 标签告知模板引擎,子模板可以重载这些特定部分。

hello.html 继承自 base.html,并替换特定的 block,修改后的 hello.html 代码如下:


{%extends "base.html" %}
{% block mainbody %}
<p>继承了 base.html 文件</p>
{% endblock %}

第一行代码表明 hello.html 继承了 base.html 文件。可以看到,相同名称的 block 标签用于替换 base.html 中对应的 block 内容。

希望本文所述内容能对基于 Django 框架的 Python 程序设计有所帮助。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。