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

Django投票分类异常排查:已回答正常未回答列表模板不显示

问题原因与解决方案

可能的问题点

  1. 模型类名错误:你代码里的polls.objects.all()和answers.objects.filter()大概率写错了模型类名。Django模型类通常采用大驼峰命名(比如Poll、Answer),如果你的模型类实际是Poll和Answer,用小写的polls、answers会导致获取的QuerySet异常,进而影响后续的对象比较逻辑。

  2. 内存对象匹配问题:即便模型类名正确,用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:10:11