各位安企CMS的运营伙伴们,大家好!作为一名深谙内容运营与技术融合之道的专家,我深知一套高效、灵活的内容管理系统对于我们日常工作的价值。安企CMS,凭借其Go语言的高性能架构和Django风格的模板引擎,无疑为我们提供了强大的内容展现能力。今天,我们就来深入探讨一个在模板设计中常见且实用的小技巧:如何在stampToDate格式化输出时间后,巧妙地利用with标签定义变量,从而在模板中实现更优雅、更高效的复用。

安企CMS模板语言的魅力:高效驱动内容呈现

安企CMS的模板系统以其简洁而强大的Django模板语法赢得了众多用户的青睐。它不仅部署简单、执行飞快,更在内容模型、多语言支持、SEO优化等方面为我们提供了极大的便利。在日常的内容发布和页面设计中,我们经常需要处理动态数据,尤其是日期和时间。将原始的时间戳转化为用户友好的日期格式,是提升用户体验的关键一环。

stampToDate:时间戳到可读日期的桥梁

在安企CMS的模板中,stampToDate标签是一个非常实用的工具,它能够将存储在数据库中的Unix时间戳(通常是10位数字)格式化成我们需要的日期和时间字符串。它的基本用法是:

{{stampToDate(时间戳, "格式")}}

这里的“时间戳”通常是内容对象(如文章archive、评论comment等)的CreatedTimeUpdatedTime字段。而“格式”则遵循Go语言特有的时间格式化标准,例如:

  • "2006-01-02" 表示 年-月-日,例如 2023-10-26
  • "2006年01月02日" 表示 年 月 日,例如 2023年10月26日
  • "15:04" 表示 时:分,例如 14:35
  • "2006-01-02 15:04:05" 表示 年-月-日 时:分:秒,例如 2023-10-26 14:35:00

比如,我们可能在文章详情页这样展示发布时间:

<p>发布时间:{{stampToDate(archive.CreatedTime, "2006年01月02日 15:04")}}</p>

这能够直接输出一个格式化好的日期时间,非常方便。

挑战:直接复用stampToDate的输出

然而,在某些场景下,我们可能不只是简单地展示格式化后的日期,还希望将这个格式化后的结果作为一个独立的变量,在模板的多个位置重复使用,或者传递给其他模板片段(如通过include标签引入的子模板)使用。

例如,我们可能需要:

  1. 在文章标题下方显示格式化日期。
  2. 在文章侧边栏的“最新文章”列表中再次显示格式化日期。
  3. 将这个日期作为参数,传递给一个专门渲染文章元信息的组件。

如果每次都调用{{stampToDate(archive.CreatedTime, "格式")}},不仅代码显得冗余,也可能影响模板解析的效率,更重要的是,当格式需要调整时,我们不得不修改多个地方。这时,我们就需要一种方式来“捕获”stampToDate的输出,并将其赋值给一个可复用的变量。

解决方案核心:引入set标签进行临时赋值

安企CMS的模板引擎提供了set标签,它允许我们在模板的当前作用域内定义一个变量并为其赋值。这正是我们解决上述挑战的关键所在!我们可以先用set标签来接收stampToDate的格式化结果,将其转换为一个普通字符串变量。

来看一个具体的例子。假设我们正在设计文章详情页的模板,需要格式化文章的创建时间:

{% set articleTimestamp = archive.CreatedTime %}
{% set formattedDate = stampToDate(articleTimestamp, "2006年01月02日 星期一 15:04") %}

<div class="article-header">
    <h1>{{ archive.Title }}</h1>
    <p class="meta">发布于:{{ formattedDate }}</p>
</div>

<div class="article-content">
    {{ archive.Content|safe }}
</div>

<div class="sidebar">
    <h3>最新动态</h3>
    <ul>
        {% archiveList latestArchives with type="list" limit="5" %}
        {% for item in latestArchives %}
        <li>
            <a href="{{ item.Link }}">{{ item.Title }}</a>
            <span class="date">{{ formattedDate }}</span> {# 这里复用formattedDate #}
            {# 噢,等一下!这里是循环中的最新文章,应该用item.CreatedTime来格式化,上面的formattedDate是当前页面的。#}
            {# 那么应该这样: #}
            <span class="date">{{ stampToDate(item.CreatedTime, "2006-01-02") }}</span>
        </li>
        {% endfor %}
        {% endarchiveList %}
    </ul>
</div>

纠正一下上例中的一个常见误区:sidebar部分,如果我们直接使用了在外部set定义的formattedDate,那么所有“最新动态”的日期都会显示当前文章的发布日期,这显然是错误的。正确的做法是在循环内部对每个itemCreatedTime进行单独的stampToDate格式化。

这再次凸显了将stampToDate的输出存储为变量的意义——它创建了一个*确切*的字符串,该字符串可以在其定义的作用域内被自由地使用。

让我们重新审视并优化这个例子,专注于如何将*当前文章*的格式化日期变量化,以便在当前模板的多个地方复用:

{# 1. 捕获当前文章的创建时间戳 #}
{% set currentArticleTimestamp = archive.CreatedTime %}
{# 2. 使用 stampToDate 格式化时间戳,并将结果赋值给一个新变量 #}
{% set formattedPublishDate = stampToDate(currentArticleTimestamp, "2006年01月02日 星期一 15:04") %}

<div class="article-header">
    <h1>{{ archive.Title }}</h1>
    {# 3. 在这里使用格式化后的日期变量 #}
    <p class="meta">发布于:{{ formattedPublishDate }}</p>
</div>

<div class="article-content">
    {{ archive.Content|safe }}
</div>

<div class="article-footer">
    {# 4. 假设我们需要在页脚也显示,直接复用变量即可 #}
    <span>本文最近更新于:{{ formattedPublishDate }}</span>
</div>

通过set formattedPublishDate = ...,我们成功地将stampToDate的输出捕获为一个变量formattedPublishDate,并在当前模板的不同位置进行了复用。

with标签:定义作用域内的变量集合,实现优雅复用

虽然set标签解决了捕获stampToDate输出的问题,但当我们需要在一个特定的代码块或要include的子模板中定义一组相关的变量时,`with