【Python】【进阶篇】30、Django模板继承精讲

news2024/11/25 2:48:53

目录

  • 30、Django模板继承精讲
    • 1. 模板继承的概念
    • 2. 模板继承的应用
    • 3. 父模板内容扩展(block.super)
    • 4. 总结归纳

30、Django模板继承精讲

在本节我们讲述模板语言中最后一个知识点,也是最重要的,那就是模板继承。模板继承和 Python 语言中类的继承含义是一样的,在 Django 中模板只是一个文本文件,如 HTML,XML,CSV等文件格式。那模板继承到底是是什么呢?如何在 Django 中使用它呢?让我们一起一探究竟。

1. 模板继承的概念

模板继承是 Django 模板语言中最强大的部分。模板继承使你可以构建基本的“骨架”模板,将通用的功能或者属性写在基础模板中,也叫基类模板或者父模板。子模板可以继承父类模板,子模板继承后将自动拥有父类中的属性和方,我们还可以在子模板中对父模板进行重写,即重写父模板中方法或者属性,从而实现子模板的定制。模板继承大大提高了代码的可重用性,减轻开发人员的工作量。

2. 模板继承的应用

那么模板继承如何使用呢?它的使用场景有哪些呢?最典型的应用是 Web 站点的头部信息和尾部信息,比如 Web 站点的底部广告,每个网页都需要放底部广告,还有 Web 站点的头部导航栏,这些都可以使用模板继承来实现。

在模板继承中最常用了标签就是 {% block %} 与 {% extends %} 标签,其中 {% block% } 标签与 {% endblock %} 标签成对出现,而 {% extends %} 放在子模板的第一行且必须是模板中的第一个标签,标志着此模板继承自父模板,它们使用方法如下所示:

    #定义父模板可被重写内容
    {%block block_name%}
    ...可以被子模板覆盖的内容
    {%endblock block_name%}
    #继承父模板
    {% extends '父模板名称' %}
    #子模板重写父模板
    {%block block_name%}
    ...子模板覆盖后呈现的新内容
    {%endblock block_name%}

需要注意的是子模板不需要重写父模板中的所有 block 标签定义的内容,未重写时,子模板原封不动的使用父模板中的内容。下面我们通过一个简单的例子来看一下具体的实现过程。

首先在 index/templates/index 目录下定义父模板 base.html,代码如下所示:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Welcome to C语言中文网 {% endblock title %}</title>
    </head>
    <body>
    <!--区域1默认区域不可以被子模板修改-->
    <p>尊敬的用户您好:</p>
    <hr>
    <!--区域2可以被子模板重写-->
    {% block content %}
    <p>这是主体内容可以被子模板重写</p>
    {% endblock content %}
    <hr>
    <!--区域3可以被子模板重写-->
    {% block footer %}
    <p>这是结尾的内容也可以被重写</p>
    {% endblock footer %}
    </body>
    </html>

然后在父模板同级路径下定义子模板文件 test.html,代码如下所示:

    {% extends 'index/base.html' %}
    <!--重写title-->
    {% block title %} 欢迎你学习Django教程 {% endblock %}
    <!--区域1保持父模板默认状态-->
    <!--对父模板的区域2进行重写-->
    {% block content %}
    {% for item in course %}
    <li>{{ item }}</li>
    {% endfor %}
    {% endblock content %}
    {% block footer %}<p>最后希望<span style="color:red">{{ name }}</span>在C语言中文网学习可以学有所成</p>
    {% endblock footer %}

在 index/views.py 文件编写视图函数,如下所示:

    #定义父模板视图函数
    def base_html(request):
        return render(request,'index/base.html')
    #定义子模板视图函数
    def index_html(request):
        name='xiaoming'
        course=['python','django','flask']
        return render(request,'index/test.html',locals())

我们在主路由使用 include 函数为 index 应用建立对应的分发式路由列表,操作步骤如下所示,首先在主路由列表关联 index 应用

    from django.urls import path,include
    from BookStore import views
    urlpatterns = [path('index/',include('index.urls'))]

然后在 index 应用目录下新建 urls.py 文件,建立主路由对应的分发式路由,代码如下所示:

    from django.urls import path
    from index import views
    urlpatterns=[
    #127.0.0.1:8000/index/test 访问子模板
    path('test/',views.index_html),
    #127.0.0.1:8000/index/base 访问父模板
    path('base/',views.base_html)]

在浏览器地址栏输入父模板 url 地址进行访问,得到的结果如下所示:

在这里插入图片描述

图1:模板继承父模板

我们在父模板中标记了哪些区域可以被子模板重写覆盖,现在我们访问子模板地址,看看它又是如何的呢?展示结果如下所示:

在这里插入图片描述

图2:模板继承子模板

我们可以看出,子模板对父模板中 {% block %} 包含的内容进行了重写覆盖,这就是模板继承应用。如果在多个模板中出现了大量复杂的代码,那么就应该考虑使用模板继承来减少重复性代码。

3. 父模板内容扩展(block.super)

所谓父模板内容扩展,即对父模板中的 block 包含内容进行添加,而并非替换。Django 为实现这一功能需求提供了 {{ block.super }}
变量,可以获取到父模板中渲染后的结果并对父模板内容进行添加,我们通过举例说明实现方法,在 base.html 中添加如下代码:

    {% block test %}
    测试模板继承:
    {% endblock test %}

最后在 test.html 文件中插入如下代码:

    {% block test %}
    {{block.super}}"block.super"实现父模板内容添加
    {% endblock %}

视图层函数保持不变。访问 127.0.0.1:8000/index/test,结果如下:

在这里插入图片描述

图3:block.super变量使用

4. 总结归纳

本节介绍了模板继承的使用,以及它的优势,Django 官网建议,在父模板中应尽量多的使用 {% block %}
标签,这样可以给我们更多的选择空间。本节知识点总结如下:

  • block 标签需要成对出现,使用 {{ endblock }} 作为结束标签;
  • 定义 block 标签名字,子模板中具有同样名称的 block 块完成对父模板的替换;
  • 子模板不需要定义父模板中的所有 block,未定义时,子模板将原样使用父模板中的内容;
  • 子模板需要使用 {% extends %} 标签继承父模板,且必须是模板中的第一个标签,并放在文件的第一行;
  • 子模板不覆盖父模板而是对父模板内容进行添加,此时使用 {{ block.super }} 变量来获取父模板 block 块的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/518563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

敏捷专题:下一代的飞机交付

随着信息化和网络化的发展&#xff0c;航空航天领域的装备已经发展成为软件密集型系统&#xff0c;软件负责完成航空装备的大部分功能。资料显示&#xff0c;以美国的F-22战斗机为例&#xff0c;由软件实现的功能已经达到80%以上&#xff0c;航空航天领域的软件规模和重要度与日…

【MySql】数据建模

目录 一&#xff1a;概念 二&#xff1a;数据建模 三&#xff1a;E-R模型 1.1E-R模型之chen方法 1.2E-R模型之crows foot方法 1.3E-R模型之idef 1x方法 一&#xff1a;概念 现实世界---->信息世界(概念模型[E-R模型])---->计算机世界(数据模型[关系、网状和层次模型])…

20230512-VSCode-配置C++17-win11-22h2

20230512-VSCode-配置C17-win11-22h2 一、软件环境 标签&#xff1a;C VSCode w64devkit gcc12分栏&#xff1a;C操作系统&#xff1a;Windows11 x64 22h2编译器&#xff1a;vscode-1.78.2 w64devkit-1.18.0 二、操作步骤 1. 下载安装VScode 官网 打开官网【https://code…

深度学习笔记——数值稳定性、模型初始化与激活函数

机器学习笔记——数值稳定性、模型初始化与激活函数 引言数值稳定性——梯度爆炸小插曲&#xff1a;关于对角阵 Diag [ σ ′ ( W t ⋅ h t − 1 ) ] \text{Diag}[\sigma(\mathcal W_t \cdot h_{t-1})] Diag[σ′(Wt​⋅ht−1​)]的解释梯度爆炸的问题 如何让参数更新更加稳定方…

移动机器人运动规划---基于图搜索的基础知识---配置空间

配置空间 机器人规划的配置空间概念&#xff1a;一个空间包含所有机器人自由度的机器人配置&#xff0c;描述为C-space 机器人配置&#xff1a;表示对机器人上面所以点的位置的描述机器人自由度&#xff1a;规划的时候用最少的坐标数量去表示机器人配置&#xff0c;例如无人机…

NFTScan: 蓝筹 NFT 跌幅严重,如何保持竞争力?

最近的市场大跌影响了 NFT 二级市场&#xff0c;市场情绪冷淡下跌严重&#xff0c;交易量和买家骤然下降&#xff0c;而蓝筹作为市场里的中流砥柱也表现不佳。以 BoerdApeYachtClub 为首的等主流 NFT 价格下跌超过 20%。此外&#xff0c;随着 PFP 的热潮已经过去&#xff0c;市…

【文章学习系列之模型】DLinear

本章内容 文章概况模型流程实验定量结果定性结果其他对比 总结 文章概况 《Are Transformers Effective for Time Series Forecasting?》是2023年发表于AAAI上的一篇文章。该文章以“Transformer在时序预测中是否有效”为论点展开讨论&#xff0c;并提出一种非Transformer系列…

SwiftUI 4.0 中 List 显示层级数据的子视图在展开和收起操作时无动画的解决

问题现象 在 SwiftUI 4.0(iOS 16+)中,一个超简单 List 视图层级子视图的收放操作竟然没有动画,这着实有点让人不爽: 从上图可以看到:我们在点击 List 子项时不仅毫无收放动画可言,而且在展开时还有卡顿,显得非常生硬。 以上代码在目前最新的 iOS 16.4.1(a) 系统中测试…

自动化测试如何做?接口自动化测试框架必备的9个功能,测试老鸟总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 当你准备使用一个…

PyQt5桌面应用开发(13):QGraphicsView框架

本文目录 PyQt5桌面应用系列PyQt5 与艺术codeQGraphicsView Framework几何QGraphicsView应用QGraphicsItem应用keyPressEvent QObject cross QThread/thread总计 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xf…

【Linux】进程控制(文件操作符收尾+重定向)

上一回进程与文件系统我们主要看了很多文件描述符的知识 1.如何理解一切皆文件&#xff1f; 每个设备被打开时&#xff0c;OS给每个文件创建一个自己的struct file 里面填充自己的属性以及自己的缓冲区&#xff0c;其中还有函数指针&#xff0c;里面保存函数地址&#xff0c;通…

京东CEO徐雷突然退休,CFO许冉接任成为首位女CEO

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 京东集团重大人事变动&#xff0c;京东集团CEO徐雷将退休&#xff0c;才49岁&#xff0c;CFO许冉将成为京东集团新任CEO。京东将迎来首位女CEO。 徐雷在48岁被任命为京东CEO&#xff0c;49岁退休。…

IS220PRTDH1A固态过载继电器不会产生热量以方便跳闸

IS220PRTDH1A固态过载继电器不会产生热量以方便跳闸 一旦触发动作发生&#xff0c;双金属片冷却并自行重塑&#xff0c;自动重新启动电路。电机在过载未消除的情况下重新启动&#xff0c;并会一次又一次地点火和重新启动。&#xff08;假设自动重启 这种类型的继电器也可以配备…

Python的画图模块turtle使用详解

简介&#xff1a;Turtle是Python语言中一个很流行的简单的绘图工具。你可以把它理解为一个小海龟&#xff0c;只听得懂有限的指令。它在一个横轴为x、纵轴为y的坐标系原点&#xff0c;(0,0)位置开始&#xff0c;它根据一组函数指令的控制&#xff0c;在这个平面坐标系中移动&am…

【中级软件设计师】—(下午题)试题三精讲总结(四十二)

【中级软件设计师】—&#xff08;下午题&#xff09;试题三精讲总结&#xff08;四十二&#xff09; 一、关系 二、UML中的图 A包含B&#xff0c;那么A执行操作前必须要先执行B 试题一&#xff08;2021年下半年&#xff09; 试题2&#xff08;2021年上半年&#xff09; 官方…

【C++初阶】类和对象下篇

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C初阶 ⭐代码仓库&#xff1a;C初阶 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们的支持是我…

板材激光切割机切割穿孔时注意的几个问题

激光切割设备广泛应用于钣金、五金制品、钢结构、汽车配件、广告、工艺品等行业&#xff0c;成为加工行业不可缺少的环节。在厚板加工中穿孔时间占很大比重&#xff0c;随着加工板材越来越厚&#xff0c;板材激光切割机切割穿孔也会相应地增加难度。 激光切割机两种常见的穿孔方…

druid 远程命令执行 (CVE-2021-25646)

漏洞原理 该漏洞主要就是根据Jackson解析特性(解析name为""时)会将value值绑定到对象(JavaScriptDimFilter&#xff0c;type为javascript时指定的)的对应参数(config)上&#xff0c;造成JavaScriptDimFilter中function属性中的javascript代码被执行。攻击者可以构造…

Redis高级数据结构HyperLogLog

HyperLogLog(Hyper[ˈhaɪpə(r)])并不是一种新的数据结构(实际类型为字符串类型)&#xff0c;而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计&#xff0c;数据集可以是IP、Email、ID等。 如果你负责开发维护一个大型的网站&#xff0c;有一天产品…

pytorch移植华为mindspore记录

因为某个需求&#xff0c;需要把原来pytorch的神经网络移植到华为的mindspore上 这边记录下遇到的坑 附上mindspore的官方教程&#xff1a; https://mindspore.cn/tutorials/zh-CN/r2.0/advanced/compute_graph.html 这边附上需要移植的网络&#xff0c;以tensorflow和pytorch…