
Django模板中若使用{% include %}加载base.html,会导致子模板内容被整体插入而非继承结构,从而使block内容无法正确渲染在header与footer之间;应改用{% extends %}实现模板继承。
django模板中若使用`{% include %}`加载base.html,会导致子模板内容被整体插入而非继承结构,从而使block内容无法正确渲染在header与footer之间;应改用`{% extends %}`实现模板继承。
在Django模板系统中,{% include %}和{% extends %}有本质区别:
-
{% include "base.html" %}:将指定模板的内容原样嵌入当前文件,不支持block替换,仅作片段复用; -
{% extends "base.html" %}:声明模板继承关系,当前模板作为子模板,通过{% block content %}...{% endblock %}向父模板中定义的block区域注入内容。
你当前的index.html错误地使用了{% include "base.html" %},导致:
- Django先渲染
base.html(此时{% block content %}为空); - 再单独渲染
index.html中{% block content %}部分——但因未继承,该block被完全忽略; - 最终页面只显示
header+footer,而<p>body</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill2691" title="Django"><img src="https://img.php.cn/upload/skill/000/000/081/178928291071323.jpg" alt="Django" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill2691" title="Django" class="overflowclass">Django</a> <p class="overflowclass">避免常见的 Django 错误——QuerySet 评估、N+1 查询、迁移冲突和 ORM 陷阱。</p> </div> <a rel="nofollow" href="/xiazai/skill2691" title="Django" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>可能因HTML解析异常或位置错乱出现在页脚之后。
✅ 正确写法(index.html):
{% extends "base.html" %}
{% load static %}
{% block content %}
<p>body</p>
{% endblock content %}
⚠️ 注意事项:
-
{% extends %}必须是模板中的第一行(前面不能有任何字符,包括空格、换行或注释); - 子模板中不能重复定义
、、等根级标签(这些应由base.html统一提供); - 若需在子模板中加载静态文件(如CSS/JS),
{% load static %}可放在{% extends %}之后,不影响继承逻辑。
这样,Django会正确将<p>body</p>注入base.html中{% block content %}的位置,最终渲染为符合预期的线性结构:<h1>header</h1> → <p>body</p> → <h1>footer</h1>,内容自然居中呈现于页眉页脚之间。










