Django模板系统核心语法详解:条件、循环与继承
本文详细介绍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 程序设计有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













