Django中如何跨视图(不同URL)传递表单提交的数据
解决Django表单提交后重定向并传递数据问题
你需要通过Session临时存储表单数据来实现重定向后的数据传递,因为重定向会发起新的GET请求,原POST请求的数据无法直接携带。具体修改如下:
1. 修改输入视图(input_view)
验证表单通过后,将清理后的表单数据存入Session,然后重定向到结果页面:
def input_view(request): if request.method == "POST": simulation_form = SimulationSettings(request.POST) strategy_form = StrategySettings(request.POST) if simulation_form.is_valid() and strategy_form.is_valid(): # 将清理后的数据存入Session request.session['simulation_settings'] = simulation_form.cleaned_data request.session['strategy_settings'] = strategy_form.cleaned_data # 重定向到结果视图对应的URL return redirect('strategy_simulator:results_view') else: simulation_form = SimulationSettings() strategy_form = StrategySettings() return render( request, "strategy_simulator/input_view.html", {"simulation_form": simulation_form, "strategy_form": strategy_form}, )
2. 修改结果视图(results_view)
从Session中取出存储的数据,同时处理用户直接访问结果页的情况(无数据时重定向回输入页):
def results_view(request): # 从Session获取表单数据 simulation_settings = request.session.get('simulation_settings') strategy_settings = request.session.get('strategy_settings') # 若Session中无数据,说明用户直接访问结果页,跳转回输入页 if not simulation_settings or not strategy_settings: return redirect('strategy_simulator:input_view') # 用完数据后删除Session中的记录,避免刷新页面重复加载 del request.session['simulation_settings'] del request.session['strategy_settings'] return render( request, "strategy_simulator/results_view.html", {"simulation_settings": simulation_settings, "strategy_settings": strategy_settings}, )
说明
- Session会自动处理数据序列化,表单
cleaned_data中的常规数据(字符串、数字、日期等)都可以直接存入。 - 删除Session数据是为了防止用户刷新结果页面时重复获取旧数据,也避免数据长期占用Session空间。
- 如果表单数据不敏感,也可以通过GET参数传递,但不推荐(URL长度有限制且数据暴露)。
内容的提问来源于stack exchange,提问作者Ravdar
相关产品推荐
相关产品推荐

