如何无需调用super()实现Flask模板继承,切换继承模板即可生效?
解决方案
可以通过调整base_header.html的模板结构,实现无需在子模板中调用super()的继承效果,具体做法如下:
1. 修改base_header.html模板
将原有直接覆盖head和content块的方式,改为保留父模板内容+新增子扩展块的结构:
{% extends "base.html" %} {% block head %} {{ super() }} <link rel="stylesheet" href="{{ url_for('static', filename='css/header.css') }}" type="text/css"/> {% block head_extra %}{% endblock %} {% endblock %} {% block content %} <header>...</header> {% block content_body %}{% endblock %} {% endblock %}
- 在
head块中先通过{{ super() }}继承base.html的原有头部内容,再添加头部专属样式,同时新增head_extra块供子模板扩展额外头部内容(比如标题、其他样式) - 在
content块中直接渲染头部元素,同时新增content_body块供子模板填充页面主体内容
2. 子模板的写法
现在子模板只需继承base_header.html,直接填充新增的扩展块即可,无需调用super():
{% extends "base_header.html" %} {% block head_extra %} <title>Page title</title> {% endblock %} {% block content_body %} <h1>Page header</h1> {% endblock %}
原理说明
原来的base_header.html直接覆盖了base.html的head和content块,导致子模板必须调用super()才能找回这些内容。调整后,base_header.html自行处理了父内容的继承,并将子模板需要自定义的区域拆分为独立的子块,子模板只需针对这些子块进行修改,无需关心父内容的继承逻辑。
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

