块内的django模板块

时间:2018-06-15 10:56:44

标签: django django-templates

我有一个主页 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 。事实并非如此,我不明白我做错了什么。

2 个答案:

答案 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')],