Django模板如何为<head>标签设置默认值并支持重写?
实现可重写且带默认值的标签(Jinja2模板继承方案)
这个需求在Jinja2(Flask默认的模板引擎)里非常好实现,核心是把<head>区域拆分成可扩展的block,让子模板可以灵活选择完全重写,或是基于默认内容做增量修改,未指定时自动沿用base里的默认配置。
第一步:修改你的base.html模板
我们把原来的<head>内容包裹在一个{% block head %}里,甚至可以把标题单独拆成更小的block(方便只改标题不动整个head):
<!DOCTYPE html> <html> <head> {% block head %} <meta charset="UTF-8"> <title>{% block title %}default value{% endblock %}</title> <meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'> {% endblock %} </head> <body> {% block content %}{% endblock %} </body> </html>
第二步:子模板的两种用法
1. 完全重写整个
如果某个页面需要完全自定义head内容,直接在子模板里重新定义{% block head %}即可,会覆盖base里的默认内容:
{% extends "base.html" %} {% block head %} <!-- 完全自定义的head内容 --> <meta charset="UTF-8"> <title>我的自定义页面标题</title> <meta name="description" content="这是一个自定义的页面描述"> <meta content='width=device-width, initial-scale=1.0' name='viewport'> <link rel="stylesheet" href="/static/custom-style.css"> {% endblock %} {% block content %} <!-- 页面具体内容 --> <p>这是我的自定义页面内容</p> {% endblock %}
2. 在默认基础上添加内容
如果只是需要加几个额外的meta标签、样式或脚本,不用完全重写,用{{ super() }}继承base里的默认head内容,再追加自己的代码即可:
{% extends "base.html" %} {% block head %} {{ super() }} <!-- 这句会渲染base里的默认head内容 --> <!-- 追加自定义内容 --> <meta name="keywords" content="Flask, Jinja2, 模板继承"> <link rel="stylesheet" href="/static/extra-style.css"> {% endblock %} {% block title %}只改标题,保留其他默认head{% endblock %} <!-- 单独修改标题 --> {% block content %} <!-- 页面具体内容 --> <p>这个页面保留了base里的默认meta,只加了额外内容和自定义标题</p> {% endblock %}
效果说明
- 如果子模板没有定义
{% block head %},会自动使用base.html里的默认内容; - 如果定义了
{% block head %},可以选择完全替换,或者用super()继承后增量修改; - 拆分出的
{% block title %}让你可以单独修改页面标题,不用动整个head结构,更灵活。
内容的提问来源于stack exchange,提问作者user2950593
相关产品推荐
相关产品推荐

