在网站内容运营中,我们常常会遇到一些需要灵活展示数据、动态调整布局的场景。简单地罗列信息有时难以满足复杂的设计需求,这时,如果能在模板中自由定义和使用一些临时变量,将大大提升我们的效率和模板的表现力。安企CMS(AnQiCMS)凭借其基于Go语言开发的强大后端和类Django的模板引擎语法,为我们提供了定义和管理临时变量的灵活机制,让打造精巧复杂的内容布局成为可能。

定义临时变量:{% with %}{% set %}

安企CMS的模板引擎提供了两种主要的标签来帮助我们定义和使用临时变量:{% with %}{% set %}。它们各有侧重,理解它们的差异能帮助我们更好地规划模板结构。

{% with %} 标签:局部作用域的优雅选择

{% with %} 标签主要用于在一个特定的代码块内部定义一个或多个临时变量。这些变量只在其 {% with %}{% endwith %} 之间有效,一旦超出这个范围,它们就不再可用。这种局部作用域的特性使得 {% with %} 成为在模板中创建独立、可重用组件,或者为某个特定展示区域准备数据时的理想选择。

想象一下,你正在为页面头部定义一些元信息,或者为某个小组件准备一些临时数据。{% with %} 就能派上用场。它不仅可以定义简单的字符串或数字,还可以传递更复杂的对象。

例如,如果你想为一个包含的文件(比如一个文章卡片组件)传递一些定制化的标题和描述:

{% with cardTitle="最新公告", cardDescription="查看我们最近发布的重要通知!" %}
    <div class="info-card">
        <h3>{{ cardTitle }}</h3>
        <p>{{ cardDescription }}</p>
    </div>
{% endwith %}
{# 在这里,cardTitle 和 cardDescription 变量已经失效 #}

更常见的是,{% with %}{% include %} 标签结合使用,为被包含的模板传递特定数据,而无需污染全局上下文,大大提升了模板组件的复用性:

{# partial/article_summary.html #}
<div class="article-summary">
    <h4><a href="{{ summary_article.Link }}">{{ summary_article.Title }}</a></h4>
    <p>发布日期:{{ summary_date }}</p>
    <p>{{ summary_article.Description|truncatechars:120 }}</p>
</div>

{# 在主模板中调用 #}
{% archiveList latestArticles with type="list" limit="3" %}
    {% for article in latestArticles %}
        {% include "partial/article_summary.html" with summary_article=article summary_date=stampToDate(article.CreatedTime, "2006-01-02") %}
    {% endfor %}
{% endarchiveList %}

在这个例子中,summary_articlesummary_date 都是在 include 语句中通过 with 定义的临时变量,它们只在 partial/article_summary.html 这个局部模板中有效。

{% set %} 标签:灵活赋值与动态计算

相比之下,{% set %} 标签则允许我们在当前模板文件或区块(如 {% block %})内定义和重新赋值变量。它的作用域更广,从定义处开始直到模板结束或者所在的 block 结束。{% set %} 在需要进行一些计算、数据转换或在循环中累积结果时显得尤为强大。

假设我们需要计算某个列表的总价,或者对一个字符串进行多步处理后再显示:

{% set greeting = "欢迎光临安企CMS" %}
<p>{{ greeting }}</p>

{% set currentYear = "2024" %}
{% set nextYear = currentYear|add:1 %} {# 使用 add 过滤器进行数字相加 #}
<p>今年是 {{ currentYear }},明年是 {{ nextYear }}。</p>

{# 在循环中进行累加计算 #}
{% set totalOrders = 0 %}
{% archiveList recentOrders with type="list" limit="5" %}
    {% for order in recentOrders %}
        {% set totalOrders = totalOrders|add:1 %} {# 每次循环 totalOrders 增加1 #}
        <p>订单号:{{ order.Id }}</p>
    {% endfor %}
{% endarchiveList %}
<p>您最近有 {{ totalOrders }} 笔订单。</p>

{% set %} 的灵活性使得它成为处理模板内部动态数据逻辑的首选。

实战应用:构建复杂内容布局

掌握了 {% with %}{% set %} 的用法,我们就能在安企CMS中实现更多复杂而精巧的布局。

1. 动态内容展示与条件判断

在内容布局中,我们经常需要根据某些条件来显示或隐藏特定的内容块。通过 {% set %} 预处理数据,然后结合 {% if %} 标签进行判断,可以让页面呈现更智能。

比如,根据文章的发布时间判断是否显示“最新”标记:

{% archiveDetail currentArticle with name="Id" %} {# 获取当前文章对象 #}
{% set publishTimestamp = currentArticle.CreatedTime %}
{% set twentyFourHoursAgo = now()|add:(-24*60*60) %} {# 假设 now() 返回当前时间戳,并减去24小时的秒数 #}

{% if publishTimestamp > twentyFourHoursAgo %}
    <span class="badge new-indicator">最新发布!</span>
{% endif %}

这里我们定义了一个 twentyFourHoursAgo 变量,用来辅助判断。

2. 数据加工与格式化,提升用户体验

有时候,从后台获取的原始数据可能不适合直接展示,需要进行格式化、截取或组合。{% set %} 配合安企CMS丰富的过滤器(Filters)就能完成这些任务。

例如,截取文章描述、格式化发布日期,并组合成更友好的展示文本:

”`twig {% archiveDetail article with name=“Id” %} {# 获取当前文章对象 #} {% set