Django中如何为继承扩展的页面添加动态标题?
Django 子页面动态修改base模板标题实现方案
Django原生模板的块(block)机制原生支持这个需求,不需要额外引入插件或写自定义标签,按下面步骤配置即可:
- 首先修改基础模板
base.html的title标签位置,预留独立的title块
把原来写死的标题替换成block标签,块内可以设置默认兜底标题,避免未单独配置的页面出现空标题:
<!-- base.html <head> 区域 --> <head> <meta charset="UTF-8"> <!-- 预留title块,默认值为站点通用名 --> <title>{% block title %}我的个人站点{% endblock %}</title> <!-- 其他css、js引用保持原有写法不变 --> </head> <body> <!-- 原有content块保留不动 --> {% block content %}{% endblock %} </body>
如果需要给所有页面标题统一加固定后缀/前缀,可以直接写在title块外面,比如
<title>{% block title %}我的个人站点{% endblock %} - 技术博客</title>,后续子页面只需要配置自身的差异化标题部分,固定后缀会自动拼接,不用每个页面重复写。
- 在各个继承base.html的子页面中,单独覆写title块即可
title块和content块是平级关系,直接写在{% extends %}标签下方,不需要嵌套在content块里,渲染时Django会自动把两个块的内容填充到base模板的对应位置。
比如首页模板的写法:
<!-- index.html --> {% extends "base.html" %} <!-- 单独配置当前页标题 --> {% block title %}网站首页{% endblock %} {% block content %} <!-- 原有首页内容完全不用改 --> <h1>欢迎访问我的站点</h1> {% endblock %}
如果是带动态数据的页面(比如文章详情页),直接把模板变量插到title块里就行,和在content里写变量的逻辑完全一致:
<!-- article_detail.html --> {% extends "base.html" %} {% block title %}{{ article.title }} - 文章详情{% endblock %} {% block content %} <h1>{{ article.title }}</h1> <div class="article-content">{{ article.content|safe }}</div> {% endblock %}
注意事项
- title块不要嵌套在content块内部,两个块是独立的平级块,书写顺序不影响最终渲染结果
- 如果某个子页面需要复用父模板的默认标题,直接省略title块即可;需要在父标题基础上追加内容的话,可以在title块里用
{{ block.super }}引用父块内容,不用重复写固定文案 - 配置完成后如果标题不生效,优先检查子页面是否正确添加了
{% extends "base.html" %}标签,以及block名称是否和base里定义的完全一致(注意大小写,不要出现{% block Title %}这类拼写错误)
内容的提问来源于stack exchange,提问作者Ashwin John Dibu
相关产品推荐
相关产品推荐

