首页 > 解决方案 > 如何使用 Django 模板作为组件?

问题描述

我有 5 个模板:index.html、detail.html、tag.html、login.html、register.htmlbase.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中解决这个问题的任何好方法?

标签: pythondjangodjango-templatesdjango-views

解决方案


编辑

正如评论中提到的OP,要求与我可以解释的完全不同。因此,根据我的新理解可以使用的修复方法就像在Tsang-Yi Shen 的评论{% 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 %}

原始答案

塞尔丘克的回答很好地解释了这个概念。我通过提供代码示例以供将来参考来补充该答案。

考虑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 %}

推荐阅读