安企CMS模板:巧用include和extends,打造高效可复用的显示模块
当你使用安企CMS搭建网站时,你很快就会发现它在组织内容展示方面非常灵活。尤其是处理模板时,内置的Django模板引擎语法让我们可以像搭积木一样高效地构建页面。今天,我们就来聊聊如何巧妙运用include和extends这两个强大的标签,来组织和管理你网站中的可复用显示模块,让你的模板更整洁、更易维护。
理解安企CMS模板的基础
在深入探讨之前,我们先回顾一下安企CMS模板的基本约定。模板文件通常以.html为后缀,并统一存放在/template目录下。你需要用到的样式、JavaScript脚本和图片等静态资源,则会放在/public/static/目录中。在模板里,我们用双花括号{{ 变量 }}来输出内容,用单花括号和百分号{% 标签 %}来控制逻辑,这与Django模板引擎的语法非常相似,上手起来也很自然。
include标签:代码片段的即插即用
想象一下,你网站的页眉、页脚、侧边栏或者某个广告位,这些内容几乎在每个页面都会出现。如果每个页面都复制粘贴一遍,不仅费时,将来要修改时也会非常麻烦。这时,include标签就派上用场了。
include标签允许你将一个独立的HTML片段(或者说代码片段)嵌入到当前的模板文件中。它的基本语法非常简单,你只需指定要引入的模板文件路径即可。通常,这些被include进来的代码片段会放在一个专门的目录下,比如/template/你的模板目录/partial/,这样方便管理。
举个例子,如果你的页眉(header)内容相对独立,可以把它放在partial/header.html:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>{{ title|default:"默认标题" }}</title>
<meta name="keywords" content="{{ keywords|default:"默认关键词" }}">
<link rel="stylesheet" href="{% system with name="TemplateUrl" %}/css/style.css">
</head>
<body>
<header class="main-header">
<h1><a href="{% system with name="BaseUrl" %}">{% system with name="SiteName" %}</a></h1>
<nav>
{% navList mainNavs %}
<ul>
{% for item in mainNavs %}
<li><a href="{{ item.Link }}">{{ item.Title }}</a></li>
{% endfor %}
</ul>
{% endnavList %}
</nav>
</header>
然后在你需要使用页眉的任何页面中,只需简单地引入:
{% include "partial/header.html" %}
有时,你可能不确定某个片段文件是否存在,或者希望它只是在存在时才被引入,这时可以加上if_exists:
{% include "partial/sidebar.html" if_exists %}
另外,include标签还允许你为引入的片段传递特定的变量。比如,我们想为上面的header.html传递一个自定义的title和keywords:
{% include "partial/header.html" with title="我的首页标题" keywords="SEO优化关键词" %}
如果你只想让include的片段使用你显式传递的变量,而不继承当前模板的所有变量,可以在with后面加上only:
{% include "partial/header.html" with title="我的首页标题" keywords="SEO优化关键词" only %}
这样,header.html中就只会识别title和keywords这两个变量,其他变量则不会被继承。
extends标签:构建网站的整体骨架
如果说include是用来插入小块积木的,那么extends就像是为你的网站设计一张总体的蓝图或骨架。它允许你定义一个基础模板(通常称为“母版”或“布局模板”),其中包含网站的公共结构,比如导航、页眉、页脚、内容区域的划分等等。
extends标签总是放在模板文件的最顶部,声明当前模板继承自哪个母版。例如,我们创建一个名为base.html的母版文件,它定义了页面的基本结构:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
{# 这个title块是可被子模板重写的区域 #}
{% block title %}
<title>默认网站标题 - {% system with name="SiteName" %}</title>
{% endblock %}
<meta name="keywords" content="{% tdk with name="Keywords" %}">
<meta name="description" content="{% tdk with name="Description" %}">
<link rel="stylesheet" href="{% system with name="TemplateUrl" %}/css/global.css">
{% block head_extra %}{# 预留给子模板添加额外head内容 #}{% endblock %}
</head>
<body>
<div class="wrapper">
<header>
{# 这里通常会include页眉代码片段 #}
{% include "partial/header.html" %}
</header>
<nav class="main-nav">
{# 导航栏代码,可能也是一个include片段 #}
</nav>
<main class="content-area">
<aside class="sidebar">
{# 侧边栏内容,也可以是include片段 #}
</aside>
<article class="main-content">
{# 这个content块是页面的主体内容,子模板会在这里填充 #}
{% block content %}
<p>这是母版中定义的默认内容。</p>
{% endblock %}
</article>
</main>
<footer>
{# 这里通常会include页脚代码片段 #}
{% include "partial/footer.html" %}
</footer>
</div>
{% block body_extra %}{# 预留给子模板添加额外body内容 #}{% endblock %}
</body>
</html>
在母版中,你需要用block标签来定义可被子模板重写或填充的区域。当子模板继承这个母版时,它可以选择性地重写这些block区域的内容。如果子模板没有重