Django访问/candidate/1/报Position对象不可迭代错误如何解决
报错修复方案
错误根因
报错核心为模板中使用{% for %}循环遍历了单个Position模型对象,单个ORM实例不是可迭代的列表/查询集,因此触发'Position' object is not iterable异常。
结合提供的代码,报错属于两种常见场景:
场景1:视图绑定模板错误
candidate_view视图错误渲染了职位列表页模板Position.html:
Position.html作为列表页,要求传入的obj是所有职位的查询集(可迭代)candidate_view中查询到的obj是单个Position实例,传入列表模板后触发遍历报错
场景2:候选人详情页模板写法错误
若确认candidate_view渲染的是candidate.html,则是candidate.html中直接写了{% for i in obj %}这类遍历单个职位对象的代码。
常规业务中职位详情页需要展示该职位下的所有候选人,应当遍历职位关联的候选人集合,而非职位对象本身。
修复方法
场景1修复
将candidate_view的渲染目标改为对应的候选人详情页模板即可,参考代码里的poll/candidate.html即可。
场景2修复
第一步:调整视图逻辑,关联查询候选人
修改candidate_view代码,将当前职位、对应候选人列表分别传入模板:
def candidate_view(request,pos): position_obj = get_object_or_404(Position,pk=pos) # 查询当前职位下的所有候选人 candidate_list = Candidate.objects.filter(pos=position_obj) if request.method == "POST": print("You are in ") return HttpResponse("Voted") else: return render(request, 'poll/candidate.html', { 'position': position_obj, 'candidate_list': candidate_list })
第二步:调整模板,遍历候选人列表
修改candidate.html代码,遍历候选人集合而非职位对象:
<h2>{{ position.title }} 候选人列表</h2> <ul> {% for candidate in candidate_list %} <li>{{ candidate.full_name }} (当前票数:{{ candidate.total_vote }})</li> {% empty %} <p>该职位暂未添加候选人</p> {% endfor %} </ul>
额外校验
请确认职位列表页对应的position_view视图代码符合列表页要求,传入的是全量职位查询集:
def position_view(request): position_list = Position.objects.all() return render(request, 'poll/Position.html', {'obj': position_list})
内容的提问来源于stack exchange,提问作者Anil Kumar
相关产品推荐
相关产品推荐

