Django模板语言(DTL)核心语法详解:变量、过滤器与标签实战

Felix
Felix
发布时间:2026-10-14 | 4人浏览过
原创

本文深入解析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相关内容,请查阅本站历史文章或继续浏览后续教程。感谢大家的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表