在构建和管理网站内容时,我们经常会遇到这样的需求:根据文章标题是否含有某个关键词,来决定是否显示一个“热点”标签;或者检查产品描述中是否提到某个特性,从而调整其展示样式。这些看似细微的动态调整,却能极大提升网站的智能化和用户体验。在AnQiCMS中,由于其灵活的Django模板引擎语法,实现这类判断并不复杂。
AnQiCMS的模板系统提供了丰富的过滤器和逻辑标签,让内容运营者无需深入后端代码,就能在前端模板层面实现复杂的逻辑判断。今天,我们就来聊聊如何在AnQiCMS模板中,判断字符串或数组是否包含特定关键词,并根据结果来智能地展示内容。
核心利器:contain 过滤器
AnQiCMS 的模板引擎提供了一个非常实用的 contain 过滤器。这个过滤器能够帮助我们迅速判断一个字符串中是否含有某个特定的词,或者一个数组里是否包含某个元素。它的工作方式非常直观,会返回 True 或 False 这样的布尔值,方便我们进行后续的逻辑判断。
例如,如果你想检查一段文字是否包含“CMS”这个词,可以直接这样写:
{{ "欢迎使用安企CMS(AnQiCMS)"|contain:"CMS" }}
这段代码执行后,会直接输出 True。
如果你的数据是一个数组,比如一个文章的标签列表,想知道其中是否包含“SEO优化”这个标签,可以先将逗号分隔的字符串转换为数组,然后使用 contain 过滤器进行判断:
{% set tags_string = "安企CMS,SEO优化,多站点管理" %}
{% set tags_array = tags_string|split:"," %} {# 使用 split 过滤器将字符串按逗号分隔成数组 #}
{{ tags_array|contain:"SEO优化" }}
这同样会输出 True。
甚至,contain 过滤器还能用来检查一个键值对(map)或结构体(struct)中是否存在某个键名(key)。比如,你有一个存储产品信息的对象,想知道它是否包含“version”这个键:
{% set product_info = {name: "AnQiCMS", version: "3.0"} %}
{{ product_info|contain:"version" }}
这也会输出 True。
结合 if 标签,智能展示内容
仅仅知道 True 或 False 显然不够,我们还需要根据这个结果来采取行动。这时,模板中的 if 逻辑判断标签就派上用场了。我们可以将 contain 过滤器的结果直接用在 if 语句中,从而实现内容的条件性展示。
想象一下,你希望给所有标题中包含“新品”的文章加上一个醒目的“新品上市”角标。在文章列表的模板中,你可以这样实现:
{% archiveList articles with type="list" limit="5" %}
{% for item in articles %}
<li>
{% if item.Title|contain:"新品" %}
<span style="color: red; font-weight: bold;">【新品上市】</span>
{% endif %}
<a href="{{item.Link}}">{{item.Title}}</a>
<p>{{item.Description|truncatechars:100}}</p>
</li>
{% empty %}
<p>暂时没有文章。</p>
{% endfor %}
{% endarchiveList %}
这样,只有当文章标题 item.Title 包含“新品”时,才会显示红色的“【新品上市】”字样。
如果你的判断条件更复杂,需要同时检查多个关键词,或者满足其中之一即可,if 标签的 and 和 or 逻辑运算符就派上用场了。例如,一篇文章的描述中同时提到“Go语言”和“SEO优化”时,显示特定的提示:
{% set article_desc = "安企CMS是基于Go语言开发的系统,支持多站点和强大的SEO优化功能。" %}
{% if article_desc|contain:"Go语言" and article_desc|contain:"SEO优化" %}
<p>这篇文章深度探讨了Go语言和SEO优化。</p>
{% elif article_desc|contain:"多站点" %}
<p>这篇文章介绍了多站点管理特性。</p>
{% else %}
<p>文章内容普通。</p>
{% endif %}
更多实用过滤器辅助判断与展示
除了 contain 之外,AnQiCMS 模板还提供了其他一些与关键词判断和展示相关的过滤器,它们能在不同场景下提供帮助。
count过滤器:计算关键词出现次数 有时候,我们不仅想知道某个关键词“有”或“没有”,还想知道它出现了多少次。count过滤器就能帮你实现这一点。{% set article_content = "安企CMS,高效的CMS,值得信赖的CMS,让你的CMS运营更轻松。" %} <p>"CMS" 在文章中出现了 {{ article_content|count:"CMS" }} 次。</p>这将输出
"CMS" 在文章中出现了 3 次。index过滤器:获取关键词首次出现的位置 如果关键词出现的位置对于你的内容展示很重要,index过滤器可以返回关键词首次出现的起始位置。如果没有找到,则返回-1。{% set intro_text = "AnQiCMS是领先的CMS内容管理系统。" %} {% set cms_position = intro_text|index:"CMS" %} {% if cms_position != -1 %} <p>"CMS" 首次出现在文本的第 {{ cms_position }} 个位置。</p> {% else %} <p>未找到"CMS"。</p> {% endif %}请注意,在计算位置时,中文会占用多个字节,可能会导致与预期有所差异,通常在英文场景下更为精确。
split过滤器:将字符串切割为数组 正如前面数组示例中所示,当你的数据源本身是一个逗号、空格或其他符号分隔的字符串,但你需要把它当成数组来判断时,split过滤器可以帮你。它可以将字符串按照指定的分隔符切割成一个字符串数组。”`twig {% set product_features_str = “高性能,模块化设计,SEO友好” %} {% set product_features_array = product