安企CMS模板:巧用includeextends,打造高效可复用的显示模块

当你使用安企CMS搭建网站时,你很快就会发现它在组织内容展示方面非常灵活。尤其是处理模板时,内置的Django模板引擎语法让我们可以像搭积木一样高效地构建页面。今天,我们就来聊聊如何巧妙运用includeextends这两个强大的标签,来组织和管理你网站中的可复用显示模块,让你的模板更整洁、更易维护。

理解安企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传递一个自定义的titlekeywords

{% include "partial/header.html" with title="我的首页标题" keywords="SEO优化关键词" %}

如果你只想让include的片段使用你显式传递的变量,而不继承当前模板的所有变量,可以在with后面加上only

{% include "partial/header.html" with title="我的首页标题" keywords="SEO优化关键词" only %}

这样,header.html中就只会识别titlekeywords这两个变量,其他变量则不会被继承。

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区域的内容。如果子模板没有重