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

Django视图中获取的问题ID与表单提交的POST请求中的ID不匹配

Django视图中获取的问题ID与表单提交的POST请求中的ID不匹配

嘿,我一眼就看出问题出在哪儿了!你在视图里写的questions = QuizQuestion.objects.order_by('?')[:2]会在每一次请求(不管是用户第一次打开页面的GET请求,还是提交表单的POST请求)都执行一次——这意味着:

  • 用户第一次访问页面时,系统随机选出了两个问题(比如你看到的ID15、17),表单里的输入框name是question_15、question_17;
  • 当用户提交表单触发POST请求时,视图又重新执行了随机查询,这次选出了新的问题(比如ID4、5),你循环打印的自然是这两个新ID,和POST里的ID完全对不上!

给你两种靠谱的解决思路:

思路一:用Session存储首次加载的问题ID

把用户第一次访问时随机选出的问题ID存在Session里,POST请求时从Session里取出这些ID再查询对应的问题,而不是重新随机选:

@login_required
def quiz_view(request):
    if request.method == 'GET':
        # GET请求时随机选2个问题,并存入Session
        questions = QuizQuestion.objects.order_by('?')[:2]
        request.session['quiz_question_ids'] = [q.id for q in questions]
    else:
        # POST请求时从Session取出之前的问题ID,查询对应的问题
        question_ids = request.session.get('quiz_question_ids', [])
        questions = QuizQuestion.objects.filter(id__in=question_ids)
    
    user = request.user

    if request.method == 'POST':
        print(request.POST)
        for question in questions:
            input_name = f"question_{question.id}"
            print(input_name)
            option_selected = request.POST.get(input_name)
            if option_selected:
                # 这里写你的用户选择处理逻辑
                pass
        # 处理完后记得清空Session里的问题ID,避免用户重复提交
        del request.session['quiz_question_ids']
    
    return render(request, '你的模板路径.html', {'questions': questions})

思路二:在表单中添加隐藏字段传递问题ID

在渲染表单时,把每个问题的ID作为隐藏字段一起输出,提交表单时这些ID会随POST请求一起发送,视图里直接用这些ID查询问题:

首先在模板里添加隐藏字段:

{% for question in questions %}
    <!-- 这里是你的问题内容和选项HTML -->
    <input type="hidden" name="question_ids" value="{{ question.id }}">
{% endfor %}

然后修改视图:

@login_required
def quiz_view(request):
    if request.method == 'GET':
        questions = QuizQuestion.objects.order_by('?')[:2]
    else:
        # 从POST请求中获取提交的问题ID列表
        question_ids = request.POST.getlist('question_ids')
        questions = QuizQuestion.objects.filter(id__in=question_ids)
    
    user = request.user

    if request.method == 'POST':
        print(request.POST)
        for question in questions:
            input_name = f"question_{question.id}"
            print(input_name)
            option_selected = request.POST.get(input_name)
            if option_selected:
                # 处理用户选择的逻辑
                pass
    
    return render(request, '你的模板路径.html', {'questions': questions})

额外提醒

  • 用Session的方式要确保你的Django项目Session配置正常(默认是开启的);
  • 用隐藏字段的方式,建议在处理POST请求时验证一下这些ID是否存在于数据库中,避免恶意用户提交无效ID搞事情。

备注:内容来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 10:18:17