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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:42:09