【发布时间】:2021-10-11 20:37:10
【问题描述】:
有没有人知道或有任何关于使用“嵌套包含标签”的不良副作用的经验? (我的意思是包含一个模板文件,它本身包含另一个模板)
例如:
文件 x.html:
{% include "z.html" %}
文件 y.html:
{% inclide "x.html" %}
【问题讨论】:
标签: django nested tags include jinja2
有没有人知道或有任何关于使用“嵌套包含标签”的不良副作用的经验? (我的意思是包含一个模板文件,它本身包含另一个模板)
例如:
文件 x.html:
{% include "z.html" %}
文件 y.html:
{% inclide "x.html" %}
【问题讨论】:
标签: django nested tags include jinja2
不好的副作用是混乱的 CSS 规则和调试时的一些令人头疼的问题。通常最好让它们保持平坦。
x.html:
{% extends "_base.html" %}
{% block main_content %}
<h1>I am X</h1>
{% include "includes/z.html" %}
{% endblock main_content %}
y.html:
{% block main_content %}
<h1>I am Y</h1>
{% include "x.html" %}
{% endblock main_content %}
z.html:
<h2>I am Z</h2>
【讨论】:
我认为您混淆了include 和extends
从逻辑上讲,在base.html 之类的应用中扩展模板非常棒,并且如果您设计模板的方式允许您为网站的某些部分扩展某些基本 html 文件。这通常是当他们共享 html 的 sn-ps 时,如主 css 块、元块、脚本块等。
您可以延长n 的次数。
您对包含感到困惑的地方是,这更多的是用于包含附加或某种“插入”的代码的 sn-ps,很好的例子是侧边栏、导航栏,甚至自定义 css 或 javascript!
问题是,你想共享 html sn-ps,还是想在某些部分而不是其他部分添加额外的 sn-ps?
如果是后者,您需要包含,而对于前者,您需要扩展。
编辑#1:
您已要求澄清上述两个模板标签的缺点。当我坐在这里思考这个问题时,我想不出使用include 或extends 的任何重大缺点,前提是您已在应该使用它们的地方使用它们。如果您使用了包含,实际上您应该使用扩展模板,您可能会发现,如其他人的回答中所述,css 规则可能不会以您期望的方式应用。
【讨论】:
没问题!通常在 Django 模板中使用继承。您可以使用一些块制作模板并覆盖子模板中的块,子模板的子级可以覆盖或使用超级块内容。
【讨论】:
我没有任何链接包含的问题。如果包含的模板中有类似名称的扩展或块,您可能会遇到问题。
【讨论】:
包含多个模板时没有问题。
例如 base.html
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
{% block title %}{% endblock %}
</head>
<body>
{% block content %}
{% endblock %}
<!-- Optional JavaScript; choose one of the two! -->
<!-- Option 1: Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
<!-- Option 2: Separate Popper and Bootstrap JS -->
<!--
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
-->
</body>
</html>
a.html
<h1>I am from A</h1>
b.html
<h2>I am from B</h2>
c.html
{% extends 'base.html' %}
{% load static %}
{% block title %}<title>Welcome in C!</title>{% endblock %}
<h3>I am from C . I am mother of A and B </h3>
{% block content %}
{% include 'a.html' %}
{% include 'b.html' %}
{% endblock %}
【讨论】: