Django投票分类异常排查:已回答正常未回答列表模板不显示
问题原因与解决方案
可能的问题点
模型类名错误:你代码里的
polls.objects.all()和answers.objects.filter()大概率写错了模型类名。Django模型类通常采用大驼峰命名(比如Poll、Answer),如果你的模型类实际是Poll和Answer,用小写的polls、answers会导致获取的QuerySet异常,进而影响后续的对象比较逻辑。内存对象匹配问题:即便模型类名正确,用
poll not in answered做判断也可能失效。因为polls = Poll.objects.all()返回的是QuerySet,每次迭代取出的poll是新的实例;而answered列表里的是从Answer外键关联过来的Poll实例,虽然主键相同,但Python会认为是不同对象,导致not in判断始终为False,最终unanswered为空。
优化实现方式
直接通过数据库查询区分已回答和未回答的投票,避免内存循环,效率更高且逻辑更可靠:
from django.shortcuts import render from .models import Poll, Answer # 确保导入正确的模型类 def polls_view(request): # 获取当前用户已回答的投票ID集合 answered_poll_ids = Answer.objects.filter(user=request.user).values_list('poll_id', flat=True) # 已回答的投票 answered = Poll.objects.filter(id__in=answered_poll_ids) # 未回答的投票:排除已回答的ID unanswered = Poll.objects.exclude(id__in=answered_poll_ids) return render(request, 'your_template.html', { 'answered': answered, 'unanswered': unanswered })
模板渲染验证
模板里可以直接遍历两个QuerySet:
<h3>已回答投票</h3> <table> {% for poll in answered %} <tr><td>{{ poll.title }}</td></tr> <!-- 替换成你的投票字段 --> {% empty %} <tr><td>暂无已回答投票</td></tr> {% endfor %} </table> <h3>未回答投票</h3> <table> {% for poll in unanswered %} <tr><td>{{ poll.title }}</td></tr> {% empty %} <tr><td>暂无未回答投票</td></tr> {% endfor %} </table>
内容的提问来源于stack exchange,提问作者Dom Wujek
相关产品推荐
相关产品推荐

