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
相关产品推荐
相关产品推荐

