django - 仅包含(继承)特定的模板块
问题描述
我的项目有两个应用程序(目前),table
和menu
. 每个应用程序都有一个模板,两个模板在项目根目录下都有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.html
include
解决方案
模板扩展通过定义可以放入东西的槽来工作。这些插槽可以填充默认值。如果您不在扩展(子)模板中覆盖它们,插槽将按原样呈现。
例如这个基地:
{% 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 模板更智能,以便它可以呈现所有变体 - 或 - 创建不同的侧边栏模板
- 如果您到处都有相同的侧边栏,但有些页面没有侧边栏,请创建不同的基本模板:一个有侧边栏插槽,一个没有。
- 如果每个页面的每个侧边栏都不同,请不要打扰包含,只需覆盖插槽
推荐阅读
- mysql - Neo4j 可以比 MySQL 更快地处理的简单现实生活场景
- graphql - graphql 在嵌套查询的父或父参数上使用嵌套查询参数
- loopbackjs - Loopback:如何在登录时包含相关模型?
- angular - 角度异步管道未触发来自 NgOnChange 的更改检测
- amazon-s3-select - botocore.exceptions.ClientError:调用 SelectObjectContent 操作时发生错误(InvalidTextEncoding)
- firebase - 填充包含文档引用数组的 Cloud Firestore 文档
- database - 如何使用所有节点上的所有可能资源在 Hadoop 中使用 MapReduce 生成 Hfile?
- firebase - FirebaseFirestore 在 OnCompleteListener、OnSuccessListener、OnCanceledListener 和 OnFailureListener 之间有所不同
- .net - SSO/SAML 与 .NET 应用程序
- c# - 如何在 UWP 应用程序中使用带有 x:Bind 的只读表达式正文属性