测验应用视图POST请求异常:答题跳转逻辑失效问题求助
问题分析与修复方案
嘿,我帮你排查下这段代码里的问题,几个关键错误导致了功能异常,咱们一个个解决:
1. 请求处理逻辑完全搞反了
你现在的代码里,GET请求(用户首次访问题目)返回的是result.html,而POST提交后不管对错都返回题目页面,这完全不符合预期——GET请求应该显示当前题目,POST处理后根据结果跳转。
2. 正确答案的判断逻辑错误
你用selected is True来验证答案,但selected是Answer模型的实例对象,不可能等于布尔值True。你应该判断它的布尔字段(比如你定义的标记正确答案的字段,假设叫is_correct,换成你实际的字段名),比如selected.is_correct。
3. 跳转逻辑混乱且无错误处理
- 选对答案时,如果是最后一题,你的代码会因为找不到下一题而报错,没有处理这种边界情况
- 选错答案时没有跳转到起始页,反而停留在当前题目
- 用
get()获取对象时没有处理不存在的情况,容易触发服务器错误
4. POST判断失效的潜在原因
别忘了Django的POST请求必须带csrf_token,如果你的表单里没加,请求会被拦截,导致request.method == 'POST'永远不成立。
修正后的完整视图代码
from django.shortcuts import render, get_object_or_404, redirect def question_detail(request, question_id, quiz_id): # 用get_object_or_404替代get(),避免对象不存在时抛500错误 quiz = get_object_or_404(Quiz, pk=quiz_id) current_question = get_object_or_404(Question, pk=question_id) total_questions = quiz.question_set.count() if request.method == 'POST': # 处理用户未选择答案的情况 try: selected_answer = current_question.answer_set.get(pk=request.POST['choice']) except (KeyError, Answer.DoesNotExist): return render(request, 'app/question_detail.html', { 'quiz': quiz, 'que': current_question, 'total_questions': total_questions, 'error_message': '请选择一个答案再提交!' }) # 验证答案是否正确 if selected_answer.is_correct: # 替换成你实际的正确答案字段名 next_rank = current_question.rank + 1 # 检查是否还有下一题 try: next_question = quiz.question_set.get(rank=next_rank) # 重定向到下一题 return redirect('question_detail', question_id=next_question.pk, quiz_id=quiz.pk) except Question.DoesNotExist: # 已经是最后一题,跳转到结果页 return render(request, 'app/result.html', {'quiz': quiz, 'total_score': total_questions}) else: # 答案错误,重定向到测验起始页(替换成你实际的起始页URL名称) return redirect('quiz_start', quiz_id=quiz.pk) else: # GET请求,渲染当前题目页面 return render(request, 'app/question_detail.html', { 'quiz': quiz, 'que': current_question, 'total_questions': total_questions })
额外注意事项
确保你的题目页面表单里包含csrf_token,否则POST请求会被Django拦截:
<form method="post"> {% csrf_token %} {% for answer in que.answer_set.all %} <input type="radio" name="choice" id="ans{{ answer.pk }}" value="{{ answer.pk }}"> <label for="ans{{ answer.pk }}">{{ answer.text }}</label><br> {% endfor %} <button type="submit">提交答案</button> </form>
内容的提问来源于stack exchange,提问作者Swapnil Mangaonker
相关产品推荐
相关产品推荐

