
Django模板中若误用{% include %}代替{% extends %},会导致block内容无法正确注入父模板的占位区域,而是被渲染在页面末尾,造成内容出现在页脚下方。正确做法是子模板必须使用{% extends %}继承基础模板。
django模板中若误用`{% include %}`代替`{% extends %}`,会导致`block`内容无法正确注入父模板的占位区域,而是被渲染在页面末尾,造成内容出现在页脚下方。正确做法是子模板必须使用`{% extends %}`继承基础模板。
在Django模板系统中,{% extends %}和{% include %}有本质区别:
-
{% extends "base.html" %}:声明继承关系,子模板通过{% block content %}向父模板中预定义的{% block content %}...{% endblock %}位置“注入”内容,实现真正的布局复用; -
{% include "base.html" %}:仅嵌入静态HTML片段,相当于把base.html全部代码原样复制到当前位置,此时子模板中的{% block content %}因无继承上下文而被忽略,最终只作为孤立代码块在当前作用域末尾执行(常表现为渲染在页脚之后)。
✅ 正确写法(子模板 index.html):
{% extends "base.html" %}
{% load static %}
{% block content %}
<p>body</p>
{% endblock content %}❌ 错误写法(导致内容错位):
{% include "base.html" %} {# ❌ 不会识别或处理下面的 block #}
{% load static %}
{% block content %}
<p>body</p>
{% endblock content %}⚠️ 注意事项:
-
extends必须是模板中的第一行非空、非注释语句,否则Django会抛出TemplateSyntaxError; -
base.html中的{% block content %}标签必须成对存在,且名称与子模板中一致(大小写敏感); - 若需在子模板中追加而非覆盖父模板的
block内容,可使用{{ block.super }}保留父级内容。
总结:确保结构层级清晰——base.html 定义骨架与block占位符,子模板通过 extends 继承并填充对应block。这是Django模板继承机制的核心约定,也是避免布局错乱的根本前提。


















