Django formtools表单已完成后重复提交重定向异常问题
问题描述
使用Django formtools实现分四阶段的表单流程,每个阶段基于NamedUrlSessionWizardView和FormPreview。用户完成某阶段后会进入摘要页,提交后数据写入数据库并跳转到跟踪页;再次点击已完成的阶段会重新显示摘要页,但此时再次提交摘要页,本该跳转到跟踪页,实际却被重定向到该阶段的表单起始页。
已确认done方法中的条件(object.stageonecomplete为True且action为submit)已满足,相关打印语句均执行,且已尝试重定向前调用self.storage.reset(),但问题依旧。
相关代码片段:
def done(self, form_list, **kwargs): object = object.objects.get( id=self.request.session["object"] ) action = self.storage.extra_data.get("action") print("action:", action) # 返回submit print("object.stageonecomplete:", object.stageonecomplete) # 返回True if object.stageonecomplete and action == "submit": print("in this loop that checks for stage one ") # 打印 object = self.add_fields(form_list, object) object.save() print("now redirecting!!") # 打印 self.storage.reset() return HttpResponseRedirect( reverse( "blah-blah-tracker", kwargs={"object": object.id}, ) )
可能的原因与解决方案
1. 提前拦截提交请求,绕过默认Wizard流程
不要等到done方法才处理,而是在post方法中提前判断阶段是否已完成,直接拦截并重定向,避免WizardView的默认逻辑干扰:
def post(self, request, *args, **kwargs): object = object.objects.get(id=self.request.session["object"]) action = self.storage.extra_data.get("action") if object.stageonecomplete and action == "submit": object = self.add_fields(self.get_form_list(), object) object.save() self.storage.reset() # 手动清除Wizard相关的Session存储 self.request.session.pop(self.storage.prefix, None) self.request.session.save() return HttpResponseRedirect( reverse("blah-blah-tracker", kwargs={"object": object.id}) ) return super().post(request, *args, **kwargs)
2. 验证URL反转的正确性
打印reverse生成的URL,确认路径与预期一致,避免因路由名称或参数错误导致的异常跳转:
tracker_url = reverse("blah-blah-tracker", kwargs={"object": object.id}) print("tracker_url:", tracker_url)
3. 彻底清除Wizard存储状态
仅调用self.storage.reset()可能不够彻底,手动清除Session中与当前Wizard绑定的前缀数据,确保残留状态不会影响后续跳转:
self.request.session.pop(self.storage.prefix, None) self.request.session.save()
4. 排查中间件干扰
检查项目中的自定义中间件,确认是否存在修改HTTP响应的逻辑(如权限验证、日志记录),意外替换了你的重定向响应。
内容的提问来源于stack exchange,提问作者Ledia Luli
相关产品推荐
相关产品推荐

