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

Django统计表单提交数量报quest_done未定义及前端渲染空白问题

问题原因及解决方案

根因说明

  • 报错local variable 'quest_done' referenced before assignment:你在函数内部对全局变量quest_done做+=修改时,Python会默认将其识别为当前函数的局部变量,但你没有在函数内部先声明全局引用也没有给局部变量赋初始值,所以触发引用报错。另外全局变量本身完全不适用于存储单用户的提交计数,多用户访问时会出现计数混乱、并发冲突问题。
  • 变量渲染空白:你定义的quest_done、question1_count、question2_count等变量仅在问卷提交的POST请求逻辑中声明,没有传递到展示提交数据的页面对应的视图中;且GET请求时这些变量根本没有定义,模板自然取不到值。

修复方案

1. 移除无效全局变量

先删除question.views.py开头的两行全局变量定义:

# 删除下面这两行
quest_done = 0
quest_count = 0

2. 修正问卷提交视图

修正两个问卷提交视图的变量定义逻辑,避免局部变量未定义问题:

def question_one(request):   
    # 计数变量放到函数开头,覆盖所有请求场景
    question1_count = QuestionOne.objects.all().count()
    if request.method == 'POST':
        form = QuestionOneForm(request.POST, request.FILES)
        if form.is_valid():           
            form.instance.user = request.user
            form.instance.quest_1_submitted = True
            form.save()
            messages.success(request, 'Form submitted')           
            return redirect('home')
    else:
        # 表单类要和当前问卷匹配,不要用错
        form = QuestionOneForm()
    return render(request, 'quest.html', {'form': form, 'question1_count': question1_count})

def question_two(request):   
    question2_count = QuestionTwo.objects.all().count()
    if request.method == 'POST':
        form = QuestionTwoForm(request.POST, request.FILES)
        if form.is_valid():           
            form.instance.user = request.user
            form.instance.quest_2_submitted = True
            form.save()
            messages.success(request, 'Form submitted')           
            return redirect('home')
    else:
        form = QuestionTwoForm()
    return render(request, 'quest.html', {'form': form, 'question2_count': question2_count})

3. 补充首页(展示提交数据页面)的视图逻辑

你提交后跳转的home视图需要查询所有需要展示的计数,传递到模板:

def home(request):
    # 普通用户查询自己的提交数
    quest_done = 0
    # 判断当前用户是否提交了问卷1
    if QuestionOne.objects.filter(user=request.user, quest_1_submitted=True).exists():
        quest_done +=1
    # 判断当前用户是否提交了问卷2
    if QuestionTwo.objects.filter(user=request.user, quest_2_submitted=True).exists():
        quest_done +=1
    # 剩余待提交数可以直接在模板计算,也可以这里算完传过去
    quest_remaining = 2 - quest_done

    # 管理员查询总提交数
    question1_count = question2_count = 0
    if request.user.is_superuser:
        question1_count = QuestionOne.objects.all().count()
        question2_count = QuestionTwo.objects.all().count()
    
    return render(request, 'home.html', {
        'quest_done': quest_done,
        'quest_remaining': quest_remaining,
        'question1_count': question1_count,
        'question2_count': question2_count
    })

4. 模板优化(可选)

可以在HTML里补充展示剩余待提交数:

Total: {{ quest_done }}/2
剩余待提交:{{ quest_remaining }}

其他注意事项

你当前模型的__str__方法中引用了不存在的self.name属性,运行时会报错,建议修改为:

def __str__(self):
    return f"{self.user.username}_question_1" # 问卷2同理修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:24:03