我有一个主页base.html。在它的内部,有一个{% block main_content %}:
<main>
<div class="container-fluid p-3">
{% block main_content %}
{% endblock %}
</div>
</main>
我将我的页面放入该主要内容 block 中。
我现在必须为一些内部文档创建很多页面,这些页面最终可能会足够小。
然后,我在 {% block main_content %} 内创建了一个 documentation.html 页面,其中包含另一个 {% block Documentation %}:
{% extends 'base.html' %}
{% load staticfiles %}
{% load crispy_forms_filters %}
{% block title %}Documentation{% endblock %}
{% block styles %}
<!-- CSS specific to documentation goes here -->
{% endblock %}
{% block main_content %}
{% block documentation %}
{% endblock documentation %}
{% endblock main_content %}
{% block end_scripts %}
<!-- Scripts specific to documentation go here -->
{% endblock end_scripts %}
我这样做是因为我的页面的这个文档部分将会有一些脚本和 css 特定的更改,这些更改将在整个子页面之间共享。然后,我将它们一次包含在此 documentation.html 页面中,并且只需更改 {% block Documentation %} 标记内的内容。然后我创建了一个测试test_page.html,如下所示:
{% extends 'documentation.html' %}
{% load staticfiles %}
{% load crispy_forms_filters %}
{% block title %}Main Page{% endblock %}
{% block documentation %}
<p>Hello world!</p>
{% endblock documentation %}
因此,test_page.html 会“插入”到 documentation.html 中,然后“插入”到 base.html 中。
我这样做的原因是,每个“插入”到 documentation.html 中的小文档 block 都会共享 CSS 和脚本,但实际的可读内容会发生变化。
由于某种原因,这不起作用。 documentation.html 确实“插入”并扩展了 base.html,但 test_page.html 却NOT 扩展进入documentation.html。
这是我在 settings.py 上的模板部分:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
str(APPS_DIR.path('templates')),
],
'OPTIONS': {
'loaders': [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
],
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.template.context_processors.i18n',
'django.template.context_processors.media',
'django.template.context_processors.static',
'django.template.context_processors.tz',
'django.contrib.messages.context_processors.messages',
],
},
},
]
我真的不明白为什么“Hello world!” test_page.html 中未显示。任何帮助将不胜感激。
总之,这就是我认为标签和内容会发生的情况:
######## This is base.html ########
<main>
<div class="container-fluid p-3">
{% block main_content %}
######## This is documentation.html ########
{% block documentation %}
######## This is test.html ########
<p>Hello world!</p>
{% endblock documentation %}
{% endblock main_content %}
</div>
</main>
因此test.html中的“Hello world!”进入documentation.html,后者进入base.html强>。事实并非如此,我不明白我做错了什么。
最佳答案
TLDR: 这是不可能的。
要获取 block 内的 block ,您可以使用{{ block.super }}
base.html ->
<div id='contnet'>{% block content %} {% endblock %}</div>
page1.html ->
{% extends base %}
{% block content %}This Content Will Always Be Here {% endblock %}
page2.html ->
{% extends page1 %}
{% block content %} New Content, Old Content: {{ block.super }} {% endblock %}
page2 的结果是这样的
<div id='content'>New Content, Old Content: This Content Will Always Be Here</div>
但是你不能做的事情(如果我没记错的话)是在 page1 中,在该内容 block 中你不能像在 Documentation.html 页面中那样添加新 block 。
一种解决方案是使用 django 平面页面或类似的东西(而不是模板继承)
关于 block 内的 django 模板 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50874172/