如何使用模板中的`if`、`for`等逻辑标签控制内容的条件显示和循环显示?

在网站内容管理中,展示动态且多样化的内容是提升用户体验和网站吸引力的关键。安企CMS(AnQiCMS)提供了强大的模板系统,借鉴了Django模板引擎的语法,让您能够轻松地通过逻辑标签来控制内容的显示。其中,if 标签用于条件判断,而 for 标签则用于循环遍历,它们是构建灵活多变页面的基石。

灵活的条件判断:if 逻辑标签的妙用

if 标签允许您根据特定的条件来决定页面上哪些内容应该显示,哪些应该隐藏。这使得内容展示更加智能化,能够适应各种业务逻辑。

基本的 if 语法非常直观:

{% if 条件 %}
    <!-- 当条件为真时显示的内容 -->
{% endif %}

例如,您可能希望只有当文档包含缩略图时才显示图片:

{% if item.Thumb %}
    <img src="{{item.Thumb}}" alt="{{item.Title}}">
{% endif %}

当您的业务逻辑需要处理多个可能性时,可以使用 elif(else if 的缩写)和 else 子句:

{% if 条件1 %}
    <!-- 当条件1为真时显示的内容 -->
{% elif 条件2 %}
    <!-- 当条件1为假且条件2为真时显示的内容 -->
{% else %}
    <!-- 当所有条件都为假时显示的内容 -->
{% endif %}

一个常见的应用场景是根据分类是否有子分类来决定显示不同的内容,比如在导航菜单中:

{% if item.HasChildren %}
    <!-- 显示子分类列表 -->
    <ul>
        {% categoryList subCategories with parentId=item.Id %}
            {% for inner in subCategories %}
                <li><a href="{{inner.Link}}">{{inner.Title}}</a></li>
            {% endfor %}
        {% endcategoryList %}
    </ul>
{% else %}
    <!-- 显示该分类下的文档列表 -->
    <p>该分类下暂无子分类,点击查看文档。</p>
    <ul>
        {% archiveList products with type="list" categoryId=item.Id limit="8" %}
            {% for inner in products %}
                <li><a href="{{inner.Link}}">{{inner.Title}}</a></li>
            {% endfor %}
        {% endarchiveList %}
    </ul>
{% endif %}

在条件表达式中,您还可以使用 andornot 等逻辑运算符来组合更复杂的条件,例如:

{% if user.IsLoggedIn and user.IsVip %}
    <p>欢迎尊贵的VIP用户,这是专属内容!</p>
{% endif %}
{% if not archive.IsPublished %}
    <p>此文章仍在草稿状态,暂未发布。</p>
{% endif %}

通过这些灵活的 if 结构,您可以精准控制页面元素的显示与隐藏,让您的网站内容根据不同的情境呈现出最恰当的形态。

强大的循环展示:for 循环标签的艺术

for 标签是安企CMS模板中用于遍历数组、切片(slice)或其他可迭代对象的关键工具,它让您能够动态地生成列表、导航、图片集等重复性内容,而无需手动编写每一个元素。

for 循环的基本结构如下:

{% for item in collection %}
    <!-- 针对集合中每个item显示的内容 -->
{% endfor %}

例如,要显示一个分类下的多篇文章列表:

{% archiveList archives with type="list" categoryId="1" limit="10" %}
    {% for item in archives %}
        <li>
            <a href="{{item.Link}}">
                <h5>{{item.Title}}</h5>
                <p>{{item.Description}}</p>
            </a>
        </li>
    {% endfor %}
{% endarchiveList %}

值得一提的是,for 循环还提供了一个 empty 子句,用于在循环的集合为空时显示一段备用内容,这对于提升用户体验非常有帮助:

{% for item in archives %}
    <li><a href="{{item.Link}}">{{item.Title}}</a></li>
{% empty %}
    <li>当前分类下没有找到任何文章。</li>
{% endfor %}

通过 empty 子句,您可以避免页面在没有数据时显得空洞,并为用户提供友好的提示。

在循环过程中,您还可以访问一些特殊的循环变量,例如:

  • forloop.Counter: 当前迭代的次数,从 1 开始。
  • forloop.Revcounter: 剩余的迭代次数,倒序计算。

这些变量在需要为循环中的特定项添加样式或编号时非常有用:

{% for item in archives %}
    <li class="{% if forloop.Counter == 1 %}first-item{% endif %}">
        <span>{{ forloop.Counter }}.</span> <a href="{{item.Link}}">{{item.Title}}</a>
    </li>
{% endfor %}

此外,for 循环还支持 reversedsorted 修饰符,分别用于倒序遍历和按默认规则排序后遍历。虽然它们不如基本循环常用,但在特定场景下能提供更多便利。

综合应用:iffor 的协同工作

在实际的模板开发中,iffor 标签往往是紧密结合在一起使用的。您可能在一个 for 循环内部使用 if 来根据每个项目的不同属性显示不同的内容,或者在一个 if 条件内部包含一个 for 循环来显示特定条件下的列表。

例如,在一个导航列表中,您可能需要遍历所有导航项,并根据导航项是否有子导航或是否为当前页面来添加不同的样式或展示不同的结构:

{% navList navs %}
    <ul>
    {% for item in navs %}
        <li class="{% if item.IsCurrent %}active{% endif %}">
            <a href="{{ item.Link }}">{{item.Title}}</a>
            {% if item.NavList %} <!-- 如果有子导航 -->
            <dl>
                {% for subItem in item.NavList %}
                    <dd class="{% if subItem.IsCurrent %}active{% endif %}">
                        <a href="{{ subItem.Link }}">{{subItem.Title}}</a>
                    </dd>
                {% endfor %}
            </dl>
            {% endif %}
        </li>
    {% endfor %}
    </ul>
{% endnavList %}

在使用这些标签显示从后台获取的富文本内容时,请务必注意使用 |safe 过滤器,以防止HTML标签被转义而显示为纯文本:

<!-- 如果 archiveContent 包含 HTML 标签,需要使用 |safe 过滤器 -->
<div>{{ archiveContent|safe }}</div>

通过巧妙地结合 iffor,您可以构建出高度动态、响应式且内容丰富的网站页面,满足各种复杂的内容展示需求。安企CMS提供的这些逻辑标签,将大大提高您内容运营的效率和灵活性。


常见问题 (FAQ)

1. 当我使用 for 循环遍历一个列表时,如果列表为空,页面上什么都不显示,我该如何显示一个“暂无内容”的提示? 您可以使用 for 循环的 empty 子句。当循环的集合为空时,empty 子句中的内容就会被显示出来。例如:

{% for item in articles %}
    <p>{{ item.Title }}</p>
{% empty %}
    <p>抱歉,目前没有找到任何文章。</p>
{% endfor %}

2. 如何在 for 循环中为第一个、最后一个或特定位置的元素添加独特的样式或行为?for 循环内部,您可以使用 forloop.Counterforloop.Revcounter 这两个特殊变量。 forloop.Counter 表示当前循环的序号(从1开始),forloop.Revcounter 表示从当前位置到循环结束还有多少项。 例如,为第一个元素添加 first 类: