将模板划分为多个部分并将每个部分包括在内?

时间:2013-05-11 14:34:04

标签: python django django-templates

我有一个基本模板,我想分成三个部分:标题,正文,页脚。然后我使用基本模板来包含三个子模板。但是,从我看到的情况来看,这意味着我无法覆盖{{block}}内容。使用包含一个坏主意呢?或者有没有办法覆盖包含模板中的块内容?

我知道您可以将静态上下文变量发送到包含的段,但它需要更加动态。

我的代码:

在header.html中

<html>
    <head>
        <script url="..."></script>
        <link rel="..." />
        {% block head_extension %}

        {% endblock %}
    </head>
    <body>
        <header>
            <div class="headerstuff">
            </div>
        </header>

然后在body.html文件中:

        <div class="container">
            {% block content %}
                Foo fum my content    
            {% endblock %}
        </div>

footer.html:

        <footer>
            {% block footer %}
                Copyright 2015
            {% endblock %}
        </footer>
    </body>
</html>

base.html文件:

{% include "header.html" %}
{% include "body.html" %}
{% include "footer.html" %}
<!-- and the part that doesn't work -->
{% block head_extension %}
    <script src="unique_script"></script>
{% endblock %}
{% block content %}
    My unique content
{% endblock %}
{% block footer %}
    Copyright 2011
{% endblock %}
<!-- end broken django templating try -->

我做错了吗?模板文档似乎表明我想要做的事情不起作用。这似乎是创建易于阅读的模板的最佳方式。将所有部件放在一个大文件中会更好吗?可以想象,标题,正文和页脚元素比这个演示要大得多。但问题仍然存在。

我希望有一种方法可以做我想到的,我不知道的。

提前致谢

1 个答案:

答案 0 :(得分:3)

你的方法很好,但你的顺序错误。首先,html起始<html>和结束标记</html>不应拆分为不同的文件,最好将其放在base.html中。

以下是如何遵循分手结构的示例:

<强> base.html文件

<html>
    <head>
        <!-- Some stuff here which should be included in all templates for example js or css -->
        {% block extra_css %}
            <!-- to included app-template dependent css -->
        {% endblock extra_css %}

        {% block extra_js %}
            <!-- to included app-template dependent js -->
        {% endblock extra_js %}

        {% block extra_head %}
            <!-- for anything else inside head -->
        {% endblock extra_head %}

    </head>
    <body>
        {% block menu %}
            <!-- Default menu here -->
            {% block extra_menu %}
                <!-- extend menu based on template -->
            {% endblock extra_menu %}
        {% endblock menu %}

        {% block content %}
            <div>This is good</div>
        {% endblock content %}

        {% include "footer.html" %}

        {% block bottom_js %}
            <!-- if you want to have manual js scripts at bottom -->
        {% endblock bottom_js %}
    </body>
</html>

现在base.html已全部设置,现在让我们假设您想要覆盖您要执行的base.html阻止content的其他子模板:

<强> child.html

{% extends "base.html" %}

{% block content %}
    <div>This is really good</div>
{% endblock content %}

因此,当加载页面时,您会看到this is really good而不是this is good(在内部块中的base.html中定义),因为您只是覆盖它。

如果你想要保留base.html中内容块内的任何内容,那么你需要扩展块而不是使用方法{{ block.super }}完全覆盖它

<强> child.html

{% extends "base.html" %}

{% block content %}
    {{ block.super }}
    <div>This is really good</div>
{% endblock content %}

现在您将看到this is goodthis is really good。希望这能澄清你的概念并带给你好处。