我有一个主页 base.html 。在其中,有一个 {%block main_content%} :
<main>
<div class="container-fluid p-3">
{% block main_content %}
{% endblock %}
</div>
</main>
我将页面插入主内容块。
我现在必须为一些内部文档创建大量页面,这可能最终会变得足够小。
然后,我在 {%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 的每个小文档块都会共享CSS和脚本,但实际的可读内容会发生变化。
由于某种原因,这不起作用。 documentation.html 确实正在“插入”并扩展 base.html ,但 test_page.html 不正在扩展进入 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 。事实并非如此,我不明白我做错了什么。
答案 0 :(得分:2)
TLDR: 不可能。
要获取块内的块,可以使用{{ 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中,则无法在该内容块中像在documentation.html页面中尝试的那样在其中添加新的块。
一种解决方案是使用django扁平页面或类似的东西(而不是模板继承)
答案 1 :(得分:1)
这是一个通用的例子,但也许它可以帮到你。
当你在文件之间使用遗产时,你需要做这样的事情。
Base.html:
<!DOCTYPE html>
<html>
<head>
{% load staticfiles %}
{% load static %}
<title> Your Title </title>
</head>
<body>
{% block content %}
{% endblock content %}
</body>
</html>
然后,如果要在基本文件中添加内容,可以创建一个新的HTML文件,如下所示:
{% extends 'Base.html' %}
{% load staticfiles %}
{% load static %}
{% block content %}
Your content will display to Base file
{% endblock content %}
如果你遵循这个过程,它应该没有问题。
根据您的模板目录,如果此模板位于您的基目录中,请尝试修改它:
str(APPS_DIR.path('templates')),
到此:
'DIRS': [os.path.join(BASE_DIR, 'templates')],