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

Django Polls应用投票后票数不显示且无报错问题求助

问题排查与解决方案

从你的代码来看,投票后票数不更新的核心问题大概率是票数更新逻辑的竞态条件,或者是一些容易忽略的细节问题,以下是具体排查步骤和修复方案:

1. 修复票数更新逻辑(优先尝试)

Django中直接使用selected_choice.votes +=1可能会因竞态条件导致更新失效(即使本地单用户测试也可能出现),改用F()表达式可以确保数据库层面的原子更新:

修改views.py,先导入F:

from django.db.models import F

然后更新vote函数的else块:

else:
    # 用F表达式实现原子更新,避免竞态条件
    selected_choice.votes = F('votes') + 1
    selected_choice.save()
    # 刷新对象以获取数据库中的最新值
    selected_choice.refresh_from_db()

    return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

2. 检查模板文件名是否匹配

你的代码中写的模板文件是details.html,但views.py的detail函数返回的是polls/detail.html(少了末尾的s),如果实际文件名是details.html,会导致模板加载异常,建议确认文件名完全一致。

3. 确保数据库迁移已执行

修改模型字段后(比如将choice_text改为choice),必须执行迁移命令更新数据库:

python manage.py makemigrations
python manage.py migrate

4. 验证请求流程与数据

在vote函数中添加打印日志,确认请求数据是否正确传递:

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    # 打印POST数据,确认是否获取到选中的选项ID
    print("POST Data:", request.POST)
    try:
        selected_choice = question.choices_set.get(pk=request.POST['choices'])
        print("Selected Choice ID:", selected_choice.id, "Current Votes:", selected_choice.votes)
    except (KeyError, Choices.DoesNotExist):
        print("Error: No choice selected or invalid choice ID")
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes = F('votes') + 1
        selected_choice.save()
        selected_choice.refresh_from_db()
        print("Updated Votes:", selected_choice.votes)

        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

运行服务器后,在控制台查看输出,确认:

  • request.POST中是否包含choices字段,值是否为选中选项的ID
  • 票数更新后的值是否正确

5. 强制刷新结果页面

浏览器可能会缓存旧页面数据,投票后按Ctrl+F5强制刷新results页面,确认显示的是最新票数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:01:46