Django中'Videos'对象不可迭代错误的排查与解决
解决Django模板中'Videos' object is not iterable错误
问题原因
你用slice:":3"处理videos QuerySet时,这个过滤器的作用是取出QuerySet的前3个单个Videos对象,而非把QuerySet拆分成每组3个的子集合。外层循环的chunk实际是单个Videos实例,内层循环for video in chunk自然会报错——单个模型对象无法被迭代。
修复方案
方法1:在视图中提前分组(推荐)
修改views.py,将QuerySet转为列表后按每3个元素一组拆分:
from django.shortcuts import render from .models import Videos def index(request): videos = list(Videos.objects.all()) # 按每3个视频为一组拆分列表 video_chunks = [videos[i:i+3] for i in range(0, len(videos), 3)] return render(request, 'index.html', {'video_chunks': video_chunks})
然后更新模板代码,直接遍历分组后的列表:
{% for chunk in video_chunks %} <div class="row"> {% for video in chunk %} <div class="col-xs-12 col-lg-4"> <div class="video-container"> <iframe class="video" src="{{ video.video_id }}" allowfullscreen></iframe> </div> </div> {% endfor %} </div> {% endfor %}
方法2:使用Django内置标签(无需修改视图)
如果不想改动视图逻辑,可通过循环索引判断实现分组:
{% for video in videos %} {% if forloop.first or forloop.counter0|divisibleby:3 %} <div class="row"> {% endif %} <div class="col-xs-12 col-lg-4"> <div class="video-container"> <iframe class="video" src="{{ video.video_id }}" allowfullscreen></iframe> </div> </div> {% if forloop.last or forloop.counter|divisibleby:3 %} </div> {% endif %} {% endfor %}
这个方法通过索引判断何时开启/闭合row容器,同样能实现每行3个视频的布局。
内容的提问来源于stack exchange,提问作者Oriander
相关产品推荐
相关产品推荐

