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

如何在Django模板中每次从列表读取3个变量迭代展示

嘿,这个问题我熟!你直接用{% for user,user2,user3 in user_list %}肯定不行,因为Django模板的for循环不支持这种直接从列表里一次取多个元素的解构写法。不过有两种靠谱的方式能实现你要的每行3个用户的布局,结合Bootstrap的row和col-4完全没问题~

方法一:在视图里预先分组(推荐,模板逻辑更简洁)

先在你的视图函数里,把用户列表分成每3个一组的子列表,这样模板里直接循环每组就行:

# views.py 里的视图函数
def your_view(request):
    user_list = User.objects.all()  # 假设这是你的用户列表
    # 每3个用户分一组
    user_chunks = [user_list[i:i+3] for i in range(0, len(user_list), 3)]
    return render(request, 'your_template.html', {'user_chunks': user_chunks})

然后在模板里,循环每个分组作为一行,再循环分组里的每个用户渲染列:

<!-- 模板代码 -->
{% for chunk in user_chunks %}
<div class="row">
    {% for user in chunk %}
    <div class="col-4">
        <form>
            <button class="btn btn-outline-primary btn-md btn-block" formaction="{% url 'interface:data' user.id %}">
                {{ user.id }}
            </button>
        </form>
    </div>
    {% endfor %}
</div>
{% endfor %}

这种方式的好处是模板逻辑简单,不用在模板里处理复杂的条件判断,适合大部分场景。

方法二:纯模板处理(不用改视图)

如果不想动视图代码,也可以直接在模板里用forloop的内置变量来控制row的开始和结束:

<!-- 模板代码 -->
{% for user in user_list %}
    {% if forloop.counter0|divisibleby:3 %}
    <div class="row">
    {% endif %}

    <div class="col-4">
        <form>
            <button class="btn btn-outline-primary btn-md btn-block" formaction="{% url 'interface:data' user.id %}">
                {{ user.id }}
            </button>
        </form>
    </div>

    {% if forloop.counter|divisibleby:3 or forloop.last %}
    </div>
    {% endif %}
{% endfor %}

这里解释下关键逻辑:

  • forloop.counter0:从0开始计数的循环索引,当它是3的倍数时(比如第1、4、7个用户),就开启一个新的row容器。
  • forloop.counter:从1开始计数的循环序号,当序号是3的倍数时(比如第3、6、9个用户),就关闭row;同时加上forloop.last的判断,确保最后一组不足3个用户时,也能正确闭合row标签。

两种方法都能完美实现你要的布局,选哪种全看你的需求偏好~

内容的提问来源于stack exchange,提问作者Lechucico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:46:34