跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Django模板继承
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Django模板继承 = '''Django模板继承'''是Django模板系统中最强大的功能之一,它允许开发者创建一个基础模板(父模板)并让其他模板(子模板)继承该模板的结构和内容,从而实现代码复用和模块化开发。此机制类似于面向对象编程中的类继承,能够显著减少重复代码并提高开发效率。 == 概述 == Django模板继承的核心思想是定义一个包含通用布局和结构的“基础模板”,然后通过子模板扩展或覆盖基础模板中的特定部分。基础模板通常包含网站的全局元素,如页眉、页脚、导航栏等,而子模板则专注于各自页面的独特内容。 === 基本语法 === Django模板继承主要使用以下三个标签: * <code>{% extends %}</code>:声明子模板继承的父模板。 * <code>{% block %}</code>:在父模板中定义可被子模板覆盖的区域。 * <code>{% endblock %}</code>:标记块的结束。 == 基础模板示例 == 以下是一个名为<code>base.html</code>的基础模板示例,它定义了网站的通用结构: <syntaxhighlight lang="html"> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}My Site{% endblock %}</title> </head> <body> <header> <h1>{% block header %}Welcome to My Site{% endblock %}</h1> </header> <main> {% block content %} <!-- 默认内容(可选) --> {% endblock %} </main> <footer> {% block footer %} <p>© 2023 My Site</p> {% endblock %} </footer> </body> </html> </syntaxhighlight> 在此模板中: * <code>{% block title %}</code>定义页面标题,默认值为"My Site"。 * <code>{% block header %}</code>定义页眉内容,默认值为"Welcome to My Site"。 * <code>{% block content %}</code>是页面的主要内容区域,默认为空。 * <code>{% block footer %}</code>定义页脚内容。 == 子模板示例 == 子模板通过<code>{% extends %}</code>标签继承父模板,并通过<code>{% block %}</code>覆盖或扩展特定区域。以下是一个名为<code>home.html</code>的子模板示例: <syntaxhighlight lang="html"> {% extends "base.html" %} {% block title %}Home Page{% endblock %} {% block header %} {{ block.super }} - The Best Site Ever! {% endblock %} {% block content %} <h2>Latest Articles</h2> <ul> <li>Article 1</li> <li>Article 2</li> </ul> {% endblock %} </syntaxhighlight> === 输出结果 === 当渲染<code>home.html</code>时,生成的HTML如下: <syntaxhighlight lang="html"> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Home Page</title> </head> <body> <header> <h1>Welcome to My Site - The Best Site Ever!</h1> </header> <main> <h2>Latest Articles</h2> <ul> <li>Article 1</li> <li>Article 2</li> </ul> </main> <footer> <p>© 2023 My Site</p> </footer> </body> </html> </syntaxhighlight> === 关键点解释 === 1. <code>{% extends "base.html" %}</code>:声明继承自<code>base.html</code>。 2. <code>{{ block.super }}</code>:引用父模板中同名块的内容,在此例中保留了原始页眉文本并追加了新内容。 3. 未覆盖的块(如<code>footer</code>)保留父模板的默认内容。 == 多级继承 == Django支持多级模板继承,形成继承链。例如: <mermaid> graph TD A[grandparent.html] --> B[parent.html] B --> C[child.html] </mermaid> * <code>child.html</code>继承<code>parent.html</code> * <code>parent.html</code>继承<code>grandparent.html</code> === 示例 === <syntaxhighlight lang="html"> {# grandparent.html #} {% block body %}Grandparent content{% endblock %} </syntaxhighlight> <syntaxhighlight lang="html"> {# parent.html #} {% extends "grandparent.html" %} {% block body %}Parent content + {{ block.super }}{% endblock %} </syntaxhighlight> <syntaxhighlight lang="html"> {# child.html #} {% extends "parent.html" %} {% block body %}Child content + {{ block.super }}{% endblock %} </syntaxhighlight> === 渲染结果 === 最终输出为:<code>Child content + Parent content + Grandparent content</code> == 实际应用场景 == === 场景1:电子商务网站 === 1. 基础模板定义全局导航、用户登录状态和页脚。 2. 产品列表页继承基础模板并覆盖<code>content</code>块显示商品。 3. 商品详情页继承同一基础模板但显示不同的<code>content</code>和自定义<code>scripts</code>块。 === 场景2:内容管理系统 === 1. 基础模板包含富文本编辑器的CSS/JS。 2. 博客文章页继承基础模板并填充<code>content</code>块。 3. 管理页面继承基础模板但添加额外的<code>admin_scripts</code>块。 == 高级技巧 == === 动态父模板选择 === 可通过变量动态选择父模板: <syntaxhighlight lang="html"> {% extends parent_template|default:"base.html" %} </syntaxhighlight> === 嵌套块 === 块可以嵌套使用: <syntaxhighlight lang="html"> {% block outer %} <div class="container"> {% block inner %}Default inner content{% endblock %} </div> {% endblock %} </syntaxhighlight> === 块修饰符 === Django 3.0+支持块修饰符: <syntaxhighlight lang="html"> {% block title trimmed %} This title will have whitespace trimmed {% endblock %} </syntaxhighlight> == 常见问题 == '''Q:如何判断模板是否被继承?''' A:使用<code>{% block.super %}</code>时,如果父模板中没有定义该块,Django会静默失败。可以通过<code>{{ block.super|default:"" }}</code>提供默认值。 '''Q:能否继承多个模板?''' A:不行,Django是单继承模型。但可以通过包含(<code>{% include %}</code>)其他模板来实现类似效果。 '''Q:如何防止块被覆盖?''' A:在父模板中移除<code>{% block %}</code>标签或将内容放在块外部。 == 数学公式示例 == 在需要展示模板继承的层次关系时,可以用数学公式表示继承深度对渲染时间的影响: <math> T(n) = O(k^n) </math> 其中: * <math>n</math> 是继承深度 * <math>k</math> 是平均块数量 == 总结 == Django模板继承是构建可维护、DRY(Don't Repeat Yourself)模板系统的关键工具。通过合理设计基础模板和继承层次,开发者可以: * 集中管理公共元素 * 减少代码重复 * 简化模板维护 * 实现一致的界面风格 掌握模板继承后,可以进一步学习Django模板系统的其他特性,如自定义标签和过滤器,以构建更强大的模板体系。 [[Category:后端框架]] [[Category:Django]] [[Category:Django模板系统]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Block.super
(
编辑
)