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

测验应用视图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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:02:42