在网站内容运营中,我们常常会遇到一些需要灵活展示数据、动态调整布局的场景。简单地罗列信息有时难以满足复杂的设计需求,这时,如果能在模板中自由定义和使用一些临时变量,将大大提升我们的效率和模板的表现力。安企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_article 和 summary_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