You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django ListView中实现每2个项的镜像布局?

解决方案

问题描述

我正在开发一个Django产品概览页面,用ListView展示分类,采用Bootstrap两栏网格布局,呈现「图片 | 信息」的形式。现在希望每第2个项进行镜像,最终效果如下:

Picture | Info
Info | Picture
Picture | Info

请问如何修改循环实现该需求?我的现有代码如下:

<div class='container'>

    {% for category in categories  %}

<!-- 检查是否存在子分类,不存在则按分类筛选,存在则按子分类筛选 -->
    {% if category.sub_category is Null %}

        <a href="{% url 'academy:brandByCat_list' category.category_name %}">
            <div class="row py-3 item-display">

                <div class='col-md item-img'>
                    <img src= {{category.category_picture.url}} class="img-fluid category-picture">
                </div>

                <div class="col-md">
                    <h1 class='py-3'>{{category.category_name}}</h1>
                    <p>{{category.category_info}}
                </div>

            </div>
        </a>



        {% else %}
        <a href="{% url 'academy:brandBySubCat_list' category.sub_category %}">
            <div class="row py-3 item-display">

                <div class='col-md item-img'>
                    <img src= {{category.category_picture.url}} class="img-fluid category-picture">
                </div>

                <div class="col-md">
                    <h1 class='py-3'>{{category.sub_category}}</h1>
                    <p>{{category.category_info}}</p>
                </div>

            </div>
        </a>

    {% endif %}


    {% endfor %}
</div>

修改方案

利用Django模板循环内置的forloop.counter变量判断当前项的位置,偶数项调换图片和信息栏的顺序即可实现镜像效果,同时优化代码减少冗余:

<div class='container'>
    {% for category in categories %}
        <!-- 统一处理跳转链接和标题,减少重复代码 -->
        {% if category.sub_category is Null %}
            {% url 'academy:brandByCat_list' category.category_name as item_url %}
            {% with display_title=category.category_name %}
        {% else %}
            {% url 'academy:brandBySubCat_list' category.sub_category as item_url %}
            {% with display_title=category.sub_category %}
        {% endif %}

        <a href="{{ item_url }}">
            <div class="row py-3 item-display">
                <!-- 根据项的奇偶性调整列顺序 -->
                {% if forloop.counter|divisibleby:2 %}
                    <!-- 偶数项:信息在前,图片在后 -->
                    <div class="col-md">
                        <h1 class='py-3'>{{ display_title }}</h1>
                        <p>{{ category.category_info }}</p>
                    </div>
                    <div class='col-md item-img'>
                        <img src="{{ category.category_picture.url }}" class="img-fluid category-picture">
                    </div>
                {% else %}
                    <!-- 奇数项:图片在前,信息在后 -->
                    <div class='col-md item-img'>
                        <img src="{{ category.category_picture.url }}" class="img-fluid category-picture">
                    </div>
                    <div class="col-md">
                        <h1 class='py-3'>{{ display_title }}</h1>
                        <p>{{ category.category_info }}</p>
                    </div>
                {% endif %}
            </div>
        </a>
        {% endwith %}
    {% endfor %}
</div>

关键说明

  • forloop.counter:从1开始计数当前循环项,配合divisibleby:2过滤器快速判断是否为偶数项
  • 使用{% with %}标签复用标题和跳转链接,避免重复编写相同结构的代码,提升可维护性
  • 偶数项调换信息栏与图片栏的顺序,实现交替镜像的布局效果
  • 完整保留了原有的子分类判断逻辑,确保跳转链接和显示标题的正确性

内容的提问来源于stack exchange,提问作者Thomas Doll-Datema

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:50:44