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

