如何在模板中引用和重写基础母版模板(extends)以统一显示风格?

📅 👁️ 78

在 AnQiCMS 的世界里,构建一个外观统一、易于管理且高效更新的网站,是每个内容运营者和开发者的共同追求。设想一下,如果网站的每个页面都需要单独设计头部、底部、侧边栏,那么当需要修改Logo、导航菜单或者版权信息时,工作量将是巨大的。幸运的是,AnQiCMS 巧妙地利用了模板继承机制,让我们能够轻松实现显示风格的统一,同时保持内容的灵活更新。

这就像是为你的网站设计了一套精美的“母版”——一个包含所有公共元素和基本布局的骨架。然后,你只需在这个骨架上填充每个页面独有的内容,就能确保整个网站看起来协调一致。AnQiCMS 采用类似 Django 模板引擎的语法,其中的 extendsblock 标签正是实现这一魔法的关键。

搭建你的网站“母版”:extends 的基石

首先,我们需要创建一个基础的母版模板,通常我们会将其命名为 base.html,并放置在你的模板目录(/template/你的模板目录/)下。这个 base.html 文件将承载网站所有页面的共同结构,比如 HTML 的基本骨架、引入的 CSS 样式、JavaScript 脚本、Logo、主导航、页脚版权信息等等。

在这个母版中,你需要定义一些“插槽”,这些插槽就是将来子页面可以填充或重写内容的区域。我们使用 block 标签来定义这些插槽。

举个例子,一个简化的 base.html 可能看起来像这样:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    {# 这里定义页面的标题,子模板可以重写 #}
    {% 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" %}">
    
    {# 引入全局CSS样式 #}
    <link rel="stylesheet" href="{% system with name="TemplateUrl" %}/css/style.css">
    {% block head_extra %}{# 预留给子模板添加额外head内容 #}{% endblock %}
</head>
<body>
    <header class="main-header">
        <div class="logo">
            <a href="{% system with name="BaseUrl" %}">
                <img src="{% system with name="SiteLogo" %}" alt="{% system with name="SiteName" %}">
            </a>
        </div>
        <nav class="main-nav">
            {# 主导航通常放在这里 #}
            {% navList navs %}
            <ul>
                {%- for item in navs %}
                    <li class="{% if item.IsCurrent %}active{% endif %}">
                        <a href="{{ item.Link }}">{{item.Title}}</a>
                        {%- if item.NavList %}
                        <dl>
                            {%- for inner in item.NavList %}
                                <dd><a href="{{ inner.Link }}">{{inner.Title}}</a></dd>
                            {% endfor %}
                        </dl>
                        {% endif %}
                    </li>
                {% endfor %}
            </ul>
            {% endnavList %}
        </nav>
    </header>

    <div class="main-content-wrapper">
        <aside class="sidebar">
            {% block sidebar %}{# 侧边栏内容 #}{% endblock %}
        </aside>
        <main class="page-content">
            {# 这是核心内容区域,每个子页面都会重写这里 #}
            {% block content %}
                <p>这里是母版默认内容,如果子模板不重写,就会显示。</p>
            {% endblock %}
        </main>
    </div>

    <footer class="main-footer">
        <p>{% system with name="SiteCopyright" %}</p>
        <p><a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">{% system with name="SiteIcp" %}</a></p>
    </footer>

    {# 引入全局JS脚本 #}
    <script src="{% system with name="TemplateUrl" %}/js/main.js"></script>
    {% block body_extra %}{# 预留给子模板添加额外body末尾内容 #}{% endblock %}
</body>
</html>

可以看到,base.html 定义了页面的整体布局,并且通过 {% block title %}{% block sidebar %}{% block content %} 等标签,为不同的区域预留了可重写的位置。即使子模板不重写这些 block,它们也会显示 base.html 中定义的默认内容。

子页面:引用母版与重写内容

现在,我们有了网站的“母版”。接下来,当你要创建像首页、文章详情页、产品列表页这样的具体页面时,就不需要重复编写头部和底部了,只需引用这个 base.html,然后重写你需要改变的 block 区域。

引用母版

在你的子模板文件(例如 index.htmlarchive/detail.htmlcategory/list.html)中,你需要做的第一件事就是使用 extends 标签来声明它继承自哪个母版。

非常重要的一点是:{% extends 'base.html' %} 必须是子模板文件的第一行代码。 模板引擎需要首先知道这个文件是基于哪个母版构建的,才能正确解析后续的内容。

重写内容

extends 声明之后,你就可以使用与母版中相同的 block 标签名称来重写该区域的内容了。

比如,针对网站的首页 index.html,你可能希望有自定义的标题和独特的首页内容,但保留公共的头部、底部和侧边栏。你可以这样编写 index.html

{# 必须是文件的第一行 #}
{% extends 'base.html' %}

{# 重写title block,定义首页标题 #}
{% block title %}
    <title>首页 - {% system with name="SiteName" %}</title>
{% endblock %}

{# 重写content block,放置首页特有的内容 #}
{% block content %}
    <h2>欢迎来到我们的网站首页!</h2>
    <p>这里是首页独有的内容,包括精选文章、推荐产品等。</p>
    
    {# 可以在这里引入其他模板片段,例如最新的文章列表 #}
    {% include 'partial/latest_articles.html' %}
{% endblock %}

{# 如果首页需要额外的脚本,可以重写body_extra block #}
{% block body_extra %}
    <script src="{% system with name="TemplateUrl" %}/js/index_specific.js"></script>
{% endblock %}

在这个 index.html 中,我们只重写了 titlecontent 这两个 block。对于 head_extrasidebarmain-headermain-footer 等区域,由于没有重写对应的 block,模板引擎会自动使用 base.html 中定义的内容。这样,我们就实现了页面的统一风格,同时又保证了内容的灵活性。

实践:统一风格与局部创新

模板继承的强大之处在于它的分层思想。你可以为不同类型的内容(如文章详情、产品列表)创建不同的“二级母版”,这些二级母版再继承自 base.html。例如,你可以有一个 article_base.html 来定义所有文章页面的通用布局(比如固定侧边栏、评论区结构等),然后具体的文章详情页再继承 article_base.html

在使用继承的时候,有一些小技巧可以帮助我们更好地组织模板:

  • 将公共头部和底部放在 base.html 中。 这是最基本的统一,确保所有页面都有相同的导航和品牌信息。
  • 将可能变动的区域定义为 block 哪怕现在看起来不会变动,预留 block 也是一个好习惯,以便未来扩展。
  • 对于小的、可复用的组件,使用 include 标签。 例如,一个“最新评论”的模块,可以在 sidebar block 中使用 {% include 'partial/latest_comments.html' %} 来引入。这使得代码更加模块化,便于维护。
  • 不要过度嵌套。 虽然 AnQiCMS 支持多级继承,但过深的继承层级可能会增加

相关文章

如何避免在内容显示时,HTML标签被自动转义?

在使用安企CMS管理网站内容时,有时会遇到一个看似小却让人头疼的问题:明明在后台编辑时输入了带有格式的HTML代码,但在前台页面显示时,这些HTML标签却变成了纯文本,甚至直接以尖括号的形式呈现,失去了应有的样式和排版。这不仅影响了页面的美观,也使得精心编排的内容大打折扣。那么,这究竟是为什么,我们又该如何解决呢? ###

2025-11-09

如何实现内容采集后,自动在网站前端显示获取的内容?

内容采集完成后,如何让获取到的内容自动在网站前端显示出来,是许多内容运营者非常关心的问题。安企CMS(AnQiCMS)作为一个高效、灵活的内容管理系统,提供了从内容入库到前台展示的完整解决方案。它通过强大的内容模型、灵活的模板标签和友好的SEO机制,让这个过程变得既简单又高效。 接下来,我们将一起探索如何利用AnQiCMS的各项功能,让您采集到的宝贵内容在网站前端自动、美观地展现。 ###

2025-11-09

如何在列表显示时,根据for循环计数,对特定项目添加特殊样式?

在网站内容展示中,我们经常需要对列表中的特定项目进行视觉上的突出,无论是为了吸引用户注意力,还是为了提升内容的层次感。例如,您可能希望给最新发布的前几篇文章加上“置顶”标记,或者让列表中的奇偶行显示不同的背景色,以增强可读性。安企CMS(AnQiCMS)灵活的模板引擎,正是为实现这些精细化控制提供了强大的支持。 AnQiCMS 的模板系统借鉴了 Django 模板引擎的语法

2025-11-09

如何在模板中,使用过滤器对显示的数字、字符串进行格式化(如浮点数位数、大小写转换)?

在网站内容呈现中,数据的美观与易读性与内容本身的质量同样重要。安企CMS(AnQiCMS)在模板层面提供了强大的过滤器(Filters)功能,让我们可以轻松地对页面上显示的数字和字符串进行格式化处理,从而提升用户体验和页面信息的专业度。 ### 过滤器:数据处理的“工序” 我们可以把过滤器想象成一道道处理数据的“工序”。原始数据就像未经加工的原材料,通过过滤器的处理,它可以变成我们需要的形状

2025-11-09

如何在模板中定义宏函数,复用常用的内容显示代码片段?

在网站内容管理系统的模板开发中,我们常常会遇到需要重复编写相同或类似的代码片段来展示特定类型内容的情况。例如,博客文章列表中的每一个文章卡片、产品详情页的每一个产品特性项,它们虽然内容不同,但结构和样式却高度相似。如果每次都手动复制粘贴这些代码,不仅效率低下,而且一旦需要修改,就得在多处重复劳动,极易出错。 安企CMS(AnQiCMS)作为一个高效的内容管理系统,其模板引擎支持类似

2025-11-09

如何在AnQiCMS后台设置中,自定义新的参数并在前端模板中调用显示?

在安企CMS中,为了满足网站个性化和灵活的内容展示需求,你可以轻松地自定义新的参数,并将这些参数在前端模板中调用显示。这大大增强了网站的定制能力,无论是为了展示特定的联系信息、文章的额外属性,还是单页面的特殊配置,都能游刃有余。 安企CMS提供了两种主要的自定义参数方式:**系统/联系方式级别的全局参数**和**内容模型级别的自定义字段**。了解这两种方式及其适用场景

2025-11-09

AnQiCMS 如何实现多站点内容的统一管理和前端显示?

在数字化时代,许多企业和内容运营团队都需要管理多个网站,这可能涉及不同品牌、产品线、地域或多语言内容。传统的做法往往意味着部署多套独立的CMS系统,导致维护成本高昂、内容更新重复、数据难以整合。面对这样的挑战,如何实现多站点内容的统一管理和高效前端显示,成为了一个亟待解决的问题。AnQiCMS(安企内容管理系统)正是在此背景下,为用户提供了一套简洁而强大的解决方案。 AnQiCMS

2025-11-09

如何利用灵活的内容模型自定义不同类型内容的展示布局?

在网站运营中,我们常常会遇到这样一种需求:不同的内容类型需要不同的展示方式。一篇新闻文章的布局可能与一个产品详情页大相径庭,而一个团队成员介绍页面又可能有着自己独特的风格。安企CMS(AnQiCMS)的灵活内容模型正是为了解决这一痛点而设计的,它允许我们深度定制内容的结构和最终的展示布局,从而为访客提供**的浏览体验。 ### 理解内容模型的核心价值 安企CMS的核心优势之一

2025-11-09