Django模板语言(DTL)核心语法详解:变量、过滤器与标签实战
本文深入解析Django模板语言(DTL)的核心语法,涵盖变量渲染、注释规范、内置过滤器(default、length、filesizeformat)及常用标签(include、for、if)。通过具体代码示例,展示如何处理字符串、列表、字典数据,以及反向循环、空值处理和条件分支逻辑,帮助开发者掌握Django模板引擎的高级用法。
前言
Django框架内置了强大的模板引擎,支持Django模板语言(Django Template Language,简称DTL)。DTL提供了丰富的语法特性,包括变量替换、代码注释、数据过滤器、控制标签、模板继承机制以及HTML自动转义功能,旨在实现逻辑与表现的分离。
本文将系统介绍DTL中的六大核心语法要素,帮助开发者快速上手并高效利用模板引擎。
1、变量
2、注释
3、过滤器
4、标签:include
5、标签:for
6、标签:if
1、变量
在DTL中,变量通过双大括号{{变量名}}的形式进行渲染。变量名由字母、数字和下划线组成,但严禁以下划线作为开头字符。当Django渲染模板时,会将变量名替换为视图传递的上下文中的对应值。若变量为对象实例,可通过点号(.)访问其属性或调用方法。

2、注释
DTL使用{#...#}语法定义单行注释,注释内容不会出现在最终渲染的HTML结果中。

需要注意的是,{#...#}注释不支持跨行。若需注释多行内容,必须使用{% comment %}标签包裹。
<p>姓名:{{ name }}</p>
{% comment "多行注释" %}
<p>年龄:{{ age }}</p>
<p>日期:{{ now }}</p>
{% endcomment %}
例如,在模板中将年龄和日期字段包裹在注释中,渲染时这些内容将被忽略。以下展示了在视图中使用该模板的示例代码。
def testTemplate(request):
time=datetime.today()
c={'name':"小镭",'age':999,'now':time}
return render(request,'testtem.html',c)
浏览器中显示的渲染结果如图所示。
3、过滤器
过滤器用于对变量进行格式化处理或修改显示结果。DTL提供了多种内置过滤器,以下是三种常用过滤器的说明:
(1)default:当变量值为False或为空字符串时,显示指定的替代值。基本语法为{{变量|default:替代值}}。
(2)length:返回字符串或列表的长度。基本语法为{{变量|length}}。
(3)filesizeformat:将字节数值转换为易读的文件大小格式(如1.1KB)。基本语法为{{变量|filesizeformat}}。

(Django框架提供了60多个内置模板过滤器,满足各种格式化需求。)
4、标签:include
标签用于执行更复杂的操作,包括包含其他模板、控制流程逻辑、生成输出文本或实现模板继承。
{% include %}标签用于引入其他模板文件,将指定模板的代码插入当前位置,并使用当前模板的上下文进行渲染。
{% include %}标签的基本语法格式如下:
{%include 模块名称%}
模块名称可以是硬编码的字符串,也可以是动态的字符串变量。例如,模板文件testtemm.html的代码如下:
模板A:{{data|default:'nothing'}}<br>
另一个模板文件testtem1.html的代码如下:
{%include 'testtemm.html'%}
模板B:当前日期:{%now "Y 年 m 月 d 日 H:i:s"%}
以下视图函数使用了模板testtem.html进行渲染。
def testTemplate1(request):
return render(request,'testtem1.html',{'data':123})
在模块testtem.html中,使用了{%now%}标签获取指定格式的当前日期字符串。浏览器显示的渲染结果如图所示。
在包含模板时,可以指定传递的参数。
{%include 'testtemm.html' with name='小镭'%}
with关键字后连接参数,参数名需与目标模板中的变量名一致。传递多个参数时,使用空格作为分隔符。
{%include 'testtemm.html' with data='abcd' data2=123%}
示例代码如下:
<!--chaper6\chaper6\templates\testtemm.html-->
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
模板A:{%include 'testtem.html' with name='小镭'%}
</body>
</html>

5、标签:for

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test1</title>
</head>
<body>
<table>
{% for r in data %}
<tr>
<td>第{{forloop.counter}}行:</td>
{% for a in r %}
<td>{{a}}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
</body>
</html>
以下视图函数使用了该模板进行数据渲染。
def test1(request):
data=[[1,2,3,4],[5,6,7,8],['a','b','c','d']]
return render(request,'test1.html',{'data':data})
浏览器显示的渲染结果如图所示。

可以通过添加reversed关键字实现反向循环。
{%for r in data reversed%}
将模板文件test1.html中的for标签修改为反向循环后,渲染结果(使用反向循环的效果)如图所示。

对于包含子列表的列表变量,for标签可以将子列表解包映射到独立的变量中。
<ul>
{% for a,b,c,d in data %}
<li>
{{ a }},{{b}},{{ c }},{{ d }}
</li>
{% endfor %}
</ul>

对于字典对象,for标签可以分别映射键和值。例如,对于字典对象{'name':“小镭”,'age':999},可使用如下模板进行遍历:
<ul>
{% for key,value in data.items %}
<li>
{{ key }}={{ value }}
</li>
{% endfor %}
</ul>
渲染结果如图所示。

在for标签块内部,可以使用{% empty %}标签。当要遍历的对象不存在或为空时,{% empty %}标签内的内容将被输出。
示例代码如下:
<ul>
{% for key,value in data1.items %}
<li>
{{ key }}={{ value }}
</li>
{% empty %}
在上下文中没找到字典对象,或者data为空
{% endfor %}
</ul>
由于data1为空字典,因此触发了{%empty%}分支的输出。

6、标签:if
if标签用于构建条件分支逻辑,其基本结构如下:
{% if var1 %}
..
{% elif var2 %}
..
{% else %}
..
{% endif %}
elif和else块均为可选,其中elif块可以出现多次。Django按顺序依次计算if和elif中的变量表达式,如果变量为“真”(即变量存在、不为空且不是False),则输出对应的数据块,并将流程跳转至endif标签之后。若所有变量均不为“真”,则输出else数据块(如果存在else块)。
例如,以下模板根据分数输出对应的等级:
分数:{{ data }},
{% if data >= 90 %}
等级:A
{% elif data >= 80 %}
等级:B
{% elif data >= 70 %}
等级:C
{% elif data >= 60 %}
等级:D
{% else %}
等级:不合格
{% endif %}
以下视图函数使用了该模板:
def test2(request):
data=int(request.GET['data'])
return render(request,'test1.html',{'data':data})
本例从URL参数中获取分数(格式为整数)。通过request.GET['data']获取的数据默认为字符串类型,因此需要将其转换为整数。如果未进行类型转换,Django会将其视为字符串处理,导致模板输出else分支的数据。
在浏览器中访问“http://127.0.0.1:8000/test2?data=88”,输出结果如图所示。


总结
至此,关于Django模板语言(DTL)的核心语法介绍完毕。如需了解更多Django相关内容,请查阅本站历史文章或继续浏览后续教程。感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













