首页 > 解决方案 > 仅包含(继承)特定的模板块

问题描述

我的项目有两个应用程序(目前),tablemenu. 每个应用程序都有一个模板,两个模板在项目根目录下都有extends一个模板。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 %}

menu_view.html

{% 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 %}

base.html

{% 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>

menu_view.html,我只是include试图阻止。然而,整个实际上是嵌入的。如何仅来自特定模板的特定块?sidebar table_view.htmlinclude

标签: djangodjango-templates

解决方案


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

例如这个基地:

{% 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>

还有这个孩子:

{% extends "base.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 %}

结果是:

<!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 模板更智能,以便它可以呈现所有变体 - 或 - 创建不同的侧边栏模板
  • 如果您到处都有相同的侧边栏,但有些页面没有侧边栏,请创建不同的基本模板:一个有侧边栏插槽,一个没有。
  • 如果每个页面的每个侧边栏都不同,请不要打扰包含,只需覆盖插槽

推荐阅读