如何使用Django模板作为组件?

时间:2018-08-10 05:07:50

标签: python django django-templates django-views

我有5个模板: index.html,detail.html,tag.html,login.html,register.html base.html

所有5个模板都将扩展 base.html

index.html,detail.html,tags.html 具有相同的<section>...</section> html代码段,并且具有来自后端的相同数据。我想将此段添加到 base .html ,因此无需在3个不同的模板中重复3次。

但是问题是 login.html和register.html 确实需要此部分。

我知道它是React.js还是Vue.js,将很容易使用组件来解决它。

在Django中解决这个问题的任何好方法吗?

2 个答案:

答案 0 :(得分:4)

您可以有多个基本模板。例如:

base.html            # Has the minimum shared elements
|
 -> base_page.html   # extends base.html (and adds your <section>...</section>)
|   |
|    -> index.html   # extends base_page.html
|    -> detail.html  # extends base_page.html
 -> login.html       # extends.base.html
 -> register.html    # extends.base.html

答案 1 :(得分:1)

编辑

正如评论中提到的OP,要求与我可以解释的完全不同。因此,根据我的较新理解,可以使用的修复程序就是Tsang-Yi Shen's comment中正确指出的{% include 'section.html' %}

base.html

<!-- HTML here.... -->
{% block normal_content %}{% endblock %}

section.html

<section>
<!-- Special Section -->
</section>

只要您需要此部分,只需添加section.html

login.html以及所有需要特殊部分的其他内容:

{% extends "base.html" %}
{% block normal_content %}
    Hey There!
    {% block section %}
        {% include 'section.html' %}
    {% endblock %}
{% endblock %}

原始答案

Selcuk's answer很好地解释了这个概念。我通过提供代码示例以供将来参考来补充该答案。

考虑base.html

<!-- HTML here.... -->
<!-- Common Section -->
{% block section %}{% endblock %}
{% block normal_content %}{% endblock %}
<!-- End Common Section -->

现在为您的版块使用模板baseWithSection.html

{% extends 'base.html' %}
{% block section %}
<section>
....
</section>
{% endblock %}
{% block special_content %}{% endblock %}

对于不包含此部分的所有页面,请像这样扩展base.html

{% extends 'base.html' %}
{% block normal_content %}
<!-- HTML here... -->
{% endblock %}

对于需要此部分的页面,请像这样扩展section.html

{% extends 'baseWithSection.html' %}
{% block special_content %}
<!-- Special HTML here, for templates pages requiring the section -->
{% endblock %}