Django模板标签详解与模板继承实战

江屿
江屿
发布时间:2026-10-12| 3人浏览过
原创

本文深入解析Django框架中的核心模板功能,详细讲解if、for等常见标签的语法与变量用法,并通过代码示例展示url和with标签的实际应用。重点剖析模板继承机制,包括extends与block的使用规范、block.super的高级技巧以及模板引用的最佳实践,帮助开发者提升代码复用性与项目结构清晰度。

一、标签语法

Django模板标签由{%和%}包围定义,例如{%tag%}或{%endtag%}。完整的标签必须包含开始标记与结束标记,以条件语句为例,既需要条件判断的开始标签,也必须有对应的结束标签来闭合逻辑。

二、常见标签

if条件判断

  • if/elif/else语句支持and、or、in、not、==、!=、<=、>=等运算符进行逻辑判断。此外,Django还提供了ifequal和ifnotequal标签用于特定值的相等性比较。

for循环

  • for ... in ...语法与Python原生用法一致,用于遍历序列或集合。
  • forloop.counter:表示当前迭代的次数,下标从1开始计数,依次显示1、2、3等。
  • forloop.counter0:表示当前迭代的次数,下标从0开始计数。若未指定其他计数器,默认使用从1开始的counter。
  • forloop.revcounter:与forloop.counter类似,但下标呈倒序排列,从最大值递减至1。
  • forloop.revcounter0:与forloop.counter0类似,但下标呈倒序排列,从最大值递减至0。
  • forloop.first:返回布尔值,若为第一次迭代则返回true,否则返回false。
  • forloop.last:返回布尔值,若为最后一次迭代则返回true,否则返回false。
  • forloop.parentloop:在多层for循环嵌套场景中,该变量引用并返回上一层级的for循环对象。
  • for...in...empty...结构:当遍历的数据序列为空时,模板将自动跳转到empty块中执行渲染。

其他重要标签

load:用于加载第三方或自定义标签库,最常见的用法是{% load static%}以加载静态文件。

url:返回一个已命名URL的绝对路径,常用于模板中的链接生成。

with:用于缓存一个变量,避免在模板中重复计算或调用复杂表达式。

autoescape:用于控制模板中内容的自动转义功能,可选择开启或关闭以处理特殊字符。

三、标签例子

if条件标签代码例子

#  views.py文件
def testif(request):
    complex = {
        'name':'python',
    }
    return render(request,'标签-if.html',complex)
 
#  urls.py文件
urlpatterns = [path('testif/', views.testif),]
<!--if标签模板文件-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>if模板</title>
    <style>span{font-size: 40px;color: #d70b35;}</style>
</head>
<body>
    {% if name == "python" %}
        这是<span>{{name}}</span>页面
    {% elif name == "django" %}
        这是<span>{{name}}</span>页面
    {% else %}
        确定是<span>{{name}}</span>吗?
    {% endif %}
</body>
</html>

  

for 循环标签代码例子

#  views.py文件
def testfor(request):
    ls = ['1','2','3','4','5']
    complex ={
        'ls':ls,
    }
    return render(request,'标签-for.html',complex)
 
#  urls.py文件
urlpatterns = [path('testfor/', views.testfor),]
<!--for标签模板文件-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>for模板</title>
    <style>a{font-size: 25px;}</style>
</head>
<body>
{% for i in ls %}
    {% if forloop.counter == 3 %}
        <a href="https://www.baidu.com" rel="external nofollow" >百度</a><br>
    {% else %}
        <a href="https://blog.csdn.net/" rel="external nofollow" >CSDN</a><br>
    {% endif %}
{% endfor %}
</body>
</html>

  

url页面转换标签例子

注意:经测试,在使用url页面转换标签时,模板中引用的链接名称必须对应urlpatterns中path定义的name属性值。若直接使用接口视图函数名而非name,将会导致报错。

错误演示

正确演示

代码

##  views.py文件
def testurl(request):
    return render(request,'URL页面转换.html')
 
##  urls.py 文件
urlpatterns = [path('testurl/', views.testurl),]
<!--  url标签模板文件  -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>URL页面转换</title>
    <style>
        a{font-size: 25px;color: #10e59d
        }
    </style>
</head>
<body>
    <a href="/index/" rel="external nofollow" >index模板</a><br>
    <a href="{% url 'temp' %}" rel="external nofollow" >使用ur标签temp模板</a><br>
    <a href="{% url 'test' 999 %}" rel="external nofollow" >使用url标签进行添加参数传递</a>
</body>
</html>

四、模板的继承

Django模板引擎中最强大且相对复杂的功能是模板继承。其核心价值在于提高代码复用性。通过模板继承,可以创建一个包含站点全部通用元素的“骨架”基础模板,并定义多个可被子模板覆盖的block(代码块)。

模板继承主要通过extends标签实现,并利用block标签向子模板开放接口。

1、extends必须是模板中出现的第一个标签,否则无法正确解析继承关系。

2、子模板中的所有具体内容,必须放置在父模板预先定义好的block标签内部,否则Django引擎将忽略并渲染这些内容。

3、当发现多处重复代码时,应优先考虑使用模板继承或包含机制来重构。

4、建议在父模板中尽可能多地定义block,以便子模板能够根据具体需求实现更细粒度的定制。

5、若在某个block中需要保留并调用父模板的原始内容,可使用block.super变量获取。

代码例子

<!-- 模板的引用页 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>引用页</title>
    <style>
        .p2{
            font-size: 25px;
            color: blue;
        }
    </style>
</head>
<body>
    <h style="font-size:40px;color:red;">这是引用页的内容</h>
</body>
</html>
<!--  模板的继承页  -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{%  block title %}默认标题{% endblock %}</title>
    <style>
        .p1{font-size: 30px;color: #8dff50
    }
        span{
            font-size: 25px;
            color: darkkhaki;
        }
    </style>
</head>
<body>
{% block content %}
    <span>这是默认内容</span>
{% endblock %}
{% block demo %}
    <span>这是演示内容</span>
{% endblock %}
</body>
</html>
<!--  模板继承的主页  -->
{% extends '模板/继承页.html' %}
{% block title %}主页(继承与引用){%  endblock  %}
{% block content %}
    <p class="p1">这是通过继承父类的:{{ block.super }}</p><br>
    <p class="p1">这是子模版的内容,没有写block就不会显示</p><br>
{% endblock %}
{% block demo %}
    <p class="p2">这是通过include引用的其他模板的内容:{% include '模板/引用页.html' %}</p>
{% endblock %}

演示结果

通过设置CSS样式可以观察到,主页成功继承并引用了模板文件,同时正确加载了继承模板及引用模板中定义的CSS样式。

到此这篇关于Python Django框架介绍之模板标签及模板的继承的文章就介绍到这了,更多相关Django框架之模板标签及模板的继承内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

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

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