在网站内容展示中,我们经常会遇到需要根据数字的整除性来调整布局或样式的情况,例如为表格的奇偶行设置不同背景色,或者每隔固定数量的内容就开启一个新行进行分组展示。在安企CMS的模板系统中,实现这样的逻辑判断是相当直接且高效的。
安企CMS的模板引擎设计得非常灵活且易于上手,它采用了类似Django模板的语法结构,允许我们通过简单的变量引用({{ 变量名 }})和逻辑控制标签({% if ... %}、{% for ... %})来构建动态内容。此外,它还提供了丰富的过滤器(filters),用于对变量进行各种处理和转换,其中就包含了一个专门用于判断数字整除性的实用工具。
核心解决方案:divisibleby 过滤器
对于判断一个数字是否能被另一个数字整除,安企CMS为我们提供了一个非常便捷且强大的工具:divisibleby 过滤器。这个过滤器专门用于检查一个数值能否被另一个数值完美整除,即除法运算后余数为零。
它的基本使用方式是在需要判断的数字变量后,通过管道符 | 连接 divisibleby 过滤器,并用冒号 : 指定作为除数的另一个数字。其语法结构大致如下:
{{ 被检查的数字 | divisibleby: 整除数 }}
当被检查的数字能够被整除数完美整除时,过滤器会返回 True(真);反之,如果不能整除,则返回 False(假)。例如,{{ 21|divisibleby:3 }} 会返回 True,而 {{ 22|divisibleby:3 }} 则会返回 False。
实际应用示例
掌握了 divisibleby 过滤器的用法,我们就可以在模板中轻松实现多种基于数字整除性的逻辑控制。
场景一:表格行交替样式
这是一个非常常见的需求,通过为表格的奇偶行赋予不同的CSS类,可以提升表格的可读性。在循环输出列表内容时,我们可以利用 for 循环内置的 forloop.Counter 变量(表示当前循环的索引,从1开始)来判断。
<table>
<thead>
<tr>
<th>序号</th>
<th>文章标题</th>
<th>发布日期</th>
</tr>
</thead>
<tbody>
{% for item in archiveList %}
<tr class="{% if forloop.Counter|divisibleby:2 %}even-row{% else %}odd-row{% endif %}">
<td>{{ forloop.Counter }}</td>
<td>{{ item.Title }}</td>
<td>{{ stampToDate(item.CreatedTime, "2006-01-02") }}</td>
</tr>
{% endfor %}
</tbody>
</table>
在这段代码中,我们检查循环计数器 forloop.Counter 是否能被 2 整除。如果能,则表示当前是偶数行,应用 even-row 类;如果不能,则表示是奇数行,应用 odd-row 类。
场景二:内容列表分组显示
假设您希望每 3 篇文章就开启一个新的行(div class="row"),来呈现三列布局,从而使内容在视觉上更加规整。这在产品展示或图文列表页中非常实用。
<div class="container">
{% for item in archiveList %}
{# 每隔3个项目或在第一个项目时开启新行 #}
{% if forloop.Counter == 1 or forloop.Counter0|divisibleby:3 %}
<div class="row">
{% endif %}
<div class="col-md-4">
<div class="article-card">
<h4>{{ item.Title }}</h4>
<p>{{ item.Description }}</p>
<a href="{{ item.Link }}">查看详情</a>
</div>
</div>
{# 每隔3个项目或在最后一个项目时关闭当前行 #}
{% if forloop.Counter|divisibleby:3 or forloop.Last %}
</div> {# 关闭 div.row #}
{% endif %}
{% endfor %}
</div>
这里我们巧妙地利用 forloop.Counter(从1开始计数)和 forloop.Counter0(从0开始计数)配合 divisibleby 过滤器来判断何时开启新行和何时关闭旧行。当 forloop.Counter0 能被3整除(即第0、3、6…个元素),或者当前是第一个元素时,我们开启一个新的 div.row。同时,当 forloop.Counter 能被3整除,或者当前是最后一个元素时(forloop.Last),我们关闭当前的 div.row,确保布局的完整性。
场景三:结合变量动态判断
divisibleby 过滤器不仅仅可以用于硬编码的数字,它也能很好地与模板中的变量结合使用。例如,您可以从系统配置中获取每行显示的文章数量,并以此作为除数。
{% set articles_per_row = system.articles_per_row %} {# 假设系统设置中有此变量,值为3或4等 #}
<div class="container">
{% for item in archiveList %}
{% if forloop.Counter == 1 or forloop.Counter0|divisibleby:articles_per_row %}
<div class="row">
{% endif %}
<div class="col-md-{{ 12|divisibleby:articles_per_row }}"> {# 动态计算列宽 #}
<div class="product-item">
<h3>{{ item.Title }}</h3>
<img src="{{ item.Thumb }}" alt="{{ item.Title }}">
</div>
</div>
{% if forloop.Counter|divisibleby:articles_per_row or forloop.Last %}
</div>
{% endif %}
{% endfor %}
</div>
在这个例子中,articles_per_row 是一个从系统配置中获取的变量,它使得分组逻辑更加灵活可控,无需修改模板代码即可调整布局。同时,我们还演示了 12|divisibleby:articles_per_row 这种用法,但要注意 divisibleby 过滤器本身返回的是布尔值,此处应该用普通的除法运算,例如 12 / articles_per_row 来动态计算列宽。如果 articles_per_row 为3,则列宽为4。
注意事项与**实践
在使用 divisibleby 过滤器时,有几个小点值得留意:
- 输入类型: 确保传递给
divisibleby过滤器的数字是有效的数值类型。通常情况下,模板变量会正确处理,但如果遇到意外情况,请检查变量的输出值。 - 可读性: 尽管模板代码可以写得很紧凑,但为了团队协作和未来维护,适当的缩进和注释仍然是良好实践。
- 与其他逻辑结合:
divisibleby过滤器返回的是布尔值,这意味着它可以直接嵌入到{% if ... %}标签中,也可以与其他逻辑运算符(如and、or、not)结合使用,构建更复杂的条件判断。 - 善用循环变量:
for循环