block 内的 django 模板 block

标签 django django-templates

我有一个主页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.htmlNOT 扩展进入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/

相关文章:

python - 如何根据用户组显示 Django 模板?

python - 如何在 Django Rest Framework 中创建 Json Web token 以供用户登录?

javascript - 如何使用javascript for循环和if语句在右表中显示数据?

python - 从 html 模板生成 PDF 并在 Django 中通过电子邮件发送

django - 覆盖 django 管理分页以及 url 参数

django - Django 模板中的表单字段

从安全角度看 Python 与 NodeJS Web 应用程序

python - 提交表单失败,但因为views.auth_login(与我的表单无关)没有返回HttpResponse对象

python - 登录或匿名用户的 django 单元测试

python - pytest-django 中的重置序列