Django 仅包含(继承)模板的特定块

Django 仅包含(继承)模板的特定块,django,django-templates,Django,Django Templates,我的项目目前有两个应用程序,表和菜单。每个应用程序都有一个模板,两个模板在项目根目录下扩展base.html模板 table_view.html {% extends "base.html" %} {% load static %} {% block title %}Table Mgt{% endblock %} {% block content %} <link href="{% static "css/table.css" %}

我的项目目前有两个应用程序,
菜单
。每个应用程序都有一个模板,两个模板
在项目根目录下扩展
base.html
模板

table_view.html

{% extends "base.html" %}
{% load static %}

{% block title %}Table Mgt{% endblock %}

{% block content %}
  <link href="{% static "css/table.css" %}" rel="stylesheet" />
  ...some elements here...
{% endblock %}

{% block sidebar %}
  <a href="#">
    <button class="sidebar_button check_in">Check In</button>
  </a>
  <a href="#">
    <button class="sidebar_button check_out">Check Out</button>
  </a>
{% endblock %}
{% extends "base.html" %}
{% load static %}
{% block title %}Menu{% endblock %}

{% block content %}
  <link href="{% static "css/menu.css" %}" rel="stylesheet"/>

{% block sidebar %}
  {% include 'table/table_view.html' %}
{% endblock %}

{% load static %}
<!DOCTYPE html>
<html>
<head>
  <title>{% block title %}{% endblock %}</title>
  <link href="{% static "css/base.css" %}" rel="stylesheet" />
</head>
<body>
  <div id="header">
    ...some elements here...
  </div>    

  <div id="sidebar">
    {% block sidebar %}
    {% endblock %}
  </div>

  <div id="content">
    {% block content %}
    {% endblock %}
  </div>
</body>
</html>
base.html

{% extends "base.html" %}
{% load static %}

{% block title %}Table Mgt{% endblock %}

{% block content %}
  <link href="{% static "css/table.css" %}" rel="stylesheet" />
  ...some elements here...
{% endblock %}

{% block sidebar %}
  <a href="#">
    <button class="sidebar_button check_in">Check In</button>
  </a>
  <a href="#">
    <button class="sidebar_button check_out">Check Out</button>
  </a>
{% endblock %}
{% extends "base.html" %}
{% load static %}
{% block title %}Menu{% endblock %}

{% block content %}
  <link href="{% static "css/menu.css" %}" rel="stylesheet"/>

{% block sidebar %}
  {% include 'table/table_view.html' %}
{% endblock %}

{% load static %}
<!DOCTYPE html>
<html>
<head>
  <title>{% block title %}{% endblock %}</title>
  <link href="{% static "css/base.css" %}" rel="stylesheet" />
</head>
<body>
  <div id="header">
    ...some elements here...
  </div>    

  <div id="sidebar">
    {% block sidebar %}
    {% endblock %}
  </div>

  <div id="content">
    {% block content %}
    {% endblock %}
  </div>
</body>
</html>
{%load static%}
{%block title%}{%endblock%}
…这里有些元素。。。
{%块边栏%}
{%endblock%}
{%block content%}
{%endblock%}
菜单_view.html
中,我试图
仅包含
侧栏。但是,整个
表_view.html
实际上是嵌入的。
如何仅包含特定模板中的特定块?

模板扩展通过定义可以放入内容的插槽来工作。这些插槽可以用默认值填充。如果不在扩展(子)模板中覆盖插槽,则插槽将按原样呈现

例如,在此基础上:

{% load static %}
<!DOCTYPE html>
<html>
<head>
  <title>{% block title %}Hello World!{% endblock %}</title>
  <link href="{% static "css/base.css" %}" rel="stylesheet" />
  {% block extra_css %}{% endblock %}
</head>
</html>
结果将是:

<!DOCTYPE html>
<html>
<head>
  <title>Hello World!</title>
  <link href="/static/css/base.css" rel="stylesheet" />
</head>
</html>

你好,世界!
使用此子模板:

{% extends "base.html" %}
{% block extra_css %}<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">{% endblock %}
{%extends“base.html”%}
{%block-extra_-css%}{%endblock%}
结果是:

<!DOCTYPE html>
<html>
<head>
  <title>Hello World!</title>
  <link href="/static/css/base.css" rel="stylesheet" />
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
</head>
</html>

你好,世界!
现在针对您的问题:

  • 如果您有不同的侧栏,请尝试使sidebar.html模板更智能,以便它可以呈现所有变体,或者创建不同的侧栏模板
  • 如果到处都有相同的侧边栏,但有些页面没有侧边栏,请创建不同的基本模板:一个有侧边栏插槽,另一个没有侧边栏插槽
  • 如果每个页面的每个侧边栏都不一样,那么不要麻烦使用include,只需覆盖插槽即可

你没有。您可以创建sidebar.html,并将其包含在侧边栏插槽中的
table_view.html
menu_view.html
中。块是可以将内容放入子模板并覆盖子模板的插槽。它们是可以用默认内容填充的空容器。Include是使用文件名进行复制/粘贴:将该文件的内容粘贴到此处。@Melwyn谢谢。我想对于每个块,我必须将其拆分为自己的模板。希望有一个更干燥的方法来做这件事。不,只有共享组件。另外,如果它们在每个页面上都相同,那么只需将默认值放在base.html中,而不要覆盖它。甚至不要在菜单_view.html模板中提到侧栏。如果它扩展了基础,那么它将包括侧边栏。