Django模板语言核心机制详解:变量、标签、过滤器与继承

Ruby
Ruby
发布时间:2026-10-13| 1人浏览过
原创

本文深入解析Django模板语言(DTL)的核心用法,涵盖变量渲染、常用标签与过滤器的具体实现。重点讲解模板继承机制以优化代码结构,并阐明render函数默认HTML转义原理及safe过滤器的应用,帮助开发者掌握Django前端模板的最佳实践。

本文详细总结了Django框架中模板语言的关键用法,旨在为读者提供实用的参考指南。

Django模板语言(DTL)概述

模板语言概述

Django模板语言(Django Template Language,简称DTL)是Django框架用于渲染HTML页面的核心组件。

模板变量与数据渲染

模板变量机制

模板变量的命名规则较为严格,只能包含数字、字母、下划线和点号(.),且严禁以下划线作为起始字符。在模板中,通过双大括号语法 {{变量名}} 来调用并显示变量值。


def index2(request):
  '''模板加载顺序'''
  return render(request, 'booktest/index2.html')
# /temp_var
def temp_var(request):
  '''模板变量'''
  my_dict = {'title': '字典键值'}
  my_list = [1, 2, 3]
  book = BookInfo.objects.get(id=1)
  #定义模板上下文
  context={'my_dict':my_dict,'my_list':my_list,'book':book}
  return render(request,'booktest/temp_var.html',context)

模板变量支持多种数据类型,包括字典、列表以及模型对象。在视图层定义好模板上下文后,需调用 render() 函数将上下文数据传递给HTML模板进行渲染。


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>模板变量</title>
</head>
<body>
使用字典属性:{{ my_dict.title }}
使用列表元素:{{ my_list.1 }}
使用对象属性:{{ book.btitle }}
</body>
</html>

值得注意的是,模板变量在访问字典键、列表索引或对象属性时,统一使用点号(.)进行调用,例如 {{ my_dict.key }} 或 {{ book.property }}。

模板标签与过滤器详解

模板标签功能


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>模板标签</title>
  <style>
    .red{
      background-color: red;
    }
    .yellow{
      background-color: yellow;
    }
    .green{
      background-color: green;
    }
  </style>
</head>
<body>
<ul>
  {% for book in books %}
    {% if book.id <= 2 %}
    <li class="red">{{ forloop.counter }}--{{ book.btitle }}</li>
    {% elif book.id >= 5 %}
      <li class="yellow">{{ forloop.counter }}--{{ book.btitle }}</li>
    {% else %}
      <li class="green">{{ forloop.counter }}--{{ book.btitle }}</li>
    {% endif %}
  {% endfor %}
</ul>
</body>
</html>

除了基础变量外,Django还提供了丰富的模板标签,具体用法可查阅Django官方文档以获取更全面的信息。

过滤器应用

过滤器主要用于对模板变量进行格式化处理或逻辑操作,增强数据的展示效果。

常用的内置过滤器包括:date(用于自定义日期显示格式)、length(计算字符串、列表、元组或字典的长度)以及 default(当变量为空时提供默认值)。

过滤器的标准调用格式为:{{ 模板变量 | 过滤器名:参数 }},通过竖线符号将变量与过滤器连接。

date过滤器示例


<li class="red">{{ book.btitle }}--{book.bpub_date | date:'Y年-m月-d日'}</li>

default过滤器示例:{{ dd | default:'无' }},当变量 dd 为空或未定义时,将显示“无”。

模板注释与继承机制

模板注释语法

单行注释使用 {# 注释内容 #} 语法,该部分内容不会在最终HTML中显示。

多行注释则使用 {% comment %} 标签包裹,适用于大段代码的屏蔽说明。

模板继承机制

当多个页面共享相同的头部、尾部或侧边栏模块时,使用模板继承可以有效减少重复代码,提高维护效率。

父模板(base.html)通常包含通用的HTML结构及占位块。


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>父模板</title>
</head>
<body>
<h1>导航条</h1>
{% block b1 %}
  <h1>这是父模板b1块中的内容</h1>
{% endblock b1 %}
<h1>版权信息</h1>
</body>
</html>

子模板(child.html)则继承父模板,并填充具体内容。


{% extends 'booktest/base.html' %}
{% block b1 %}
  {{ block.super }}
  <h1>这是子模板b1的内容</h1>
{% endblock b1 %}

在父模板中,通过 {% block b1 %} <h1>这是父模板b1块中的内容</h1> {% endblock b1 %} 定义命名块(block),该块内可包含默认内容。子模板在继承时,使用 {% extends 'booktest/base.html' %} 指令导入父模板,随后通过 {% block b1 %} {{ block.super }} <h1>这是子模板b1的内容</h1> {% endblock b1 %} 重新定义同名块,利用 {{ block.super }} 保留父模板中的原有内容,从而实现内容的扩展与覆盖。

HTML转义与安全处理

HTML转义处理

通过 render() 函数传递的模板上下文默认启用HTML转义,这意味着传入的HTML标签会被视为纯字符串显示,而非渲染为HTML元素。若需直接输出HTML代码,可使用 safe 过滤器关闭转义。


{{context | safe}}

希望本文关于Django框架模板语言的解析能对读者的Python Web开发有所帮助。

相关标签:

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

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 算法库。