Django初学者。我有一个带有徽标的基本模板,以及三个内容子部分。其中两个小节默认包含html,其余小节用于每个子页面的内容。
我现在想创建一个不同的页面,其中完全相同的徽标,但具有不同的子部分/内容。例如我可能只需要两个子部分,水平格式而不是垂直格式等。
所以,为此我想我需要创建一个新模板 - 问题是我通过在新模板中使用与第一个模板完全相同的徽标html代码来违反DRY主体。
那么,在这种情况下,是否有任何设计模式可以解决重复徽标代码的问题?我正在考虑将isPage1
或isPage2
等变量传递给模板,然后我会基于此启用/禁用块 - 这是一种可行的方法,任何人都可以提供任何替代方案吗?
非常感谢
答案 0 :(得分:6)
是的,有一种模式完全符合您的需求。它在DJANGO中被称为template inheritance。
您的标题,徽标和主要内容占位符基本上都有基本模板。类似的东西(从我上面的链接中提取):
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title>{% block title %}My amazing site{% endblock %}</title>
</head>
<body>
<div id="sidebar">
{% block sidebar %}
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog/">Blog</a></li>
</ul>
{% endblock %}
</div>
<div id="content">
{% block content %}{% endblock %}
</div>
</body>
</html>
然后,在您的实际网页(使用模板的网页)上,您将拥有:
{% extends "base.html" %}
{% block title %}My amazing blog{% endblock %}
{% block content %}
{% for entry in blog_entries %}
<h2>{{ entry.title }}</h2>
<p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}
请注意,此处的基本模板称为base.html
。因此,在您的网页中,通过放置base.html
扩展 {% extends "base.html" %}
。然后,在该页面中,您只需添加特定block
的内容。
答案 1 :(得分:0)
You can use this inheritance concept in different way.
use same block tags to whole application
filename: index.html
<html>
<head>
---style.css files here---
{% block title %}title{% endblock %}
{% block additional_css_files %}css files{% endblock %}
{% block header %}header and header menus{% endblock %}
</head>
<body>
{% block main_content %}
your body content here
{% endblock %}
{% block scripts %}Script files{% endblock %}
</body>
</html>
filename: home.html
{% extends "index.html" %}
{% block title %}title2{% endblock %}# u can overwrite the title with new title
but if you want to use parent title no need to mention block tags in home.html
or you have to use {% block title %}{{block.super}}{% endblock %}
same concept come below.
{% block additional_css_files %}css files2{% endblock %}
{% block header %}header and header menus{% endblock %}