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

Django表单提交后点击返回按钮出现重复提交问题求助

解决Django表单提交后返回按钮显示旧数据并可重复提交的问题

看起来你遇到的问题是表单提交后,点击浏览器返回按钮会回到带有已填数据的表单页面,甚至可以重复提交——这本质上是没有正确应用**Post/Redirect/Get (PRG)**设计模式导致的,另外你的代码当前提交后是重定向回表单页面,而不是你想要的主页面,这也需要调整。

问题分析

你的现有代码中,表单验证成功后虽然用了HttpResponseRedirect,但重定向的目标是当前表单页面(request.path_info),而且你在重定向前重新初始化form = ContactsForm()的操作是多余的——因为重定向后会触发新的GET请求,走到else分支重新生成空表单。但核心问题是:如果用户提交后没有跳转到主页面,或者跳转后返回时浏览器缓存了POST请求的状态,就会出现重复提交的提示和旧数据残留。

解决方案

我们需要做两个关键调整:

  1. 表单提交成功后重定向到主页面(而不是当前表单页),确保使用PRG模式切断POST请求的历史记录链。
  2. 移除多余的表单初始化代码,让重定向后的GET请求自然生成空表单。

修改后的views.py代码如下:

from django.urls import reverse  # 记得导入reverse
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.shortcuts import render

def contact(request):
    if request.method == "POST":                      
        form = ContactsForm(request.POST, request.FILES)        
        if form.is_valid():   
            form.save()    
            messages.success(request, 'Contact request submitted successfully.')      
            # 重定向到主页面,替换成你主页面的URL name
            return HttpResponseRedirect(reverse('home')) 

        else:
            messages.error(request, 'Invalid form submission.')
            
    else:
        form = ContactsForm() 

    projects = Projects.objects.filter(status=1).order_by('-updated_at')
    
    return render(request,'main/contact.html',{'contact':'current','projects':projects,'form':form})

为什么这样有效?

  • PRG模式:当表单通过POST提交并验证成功后,我们用重定向(GET请求)跳转到主页面。此时浏览器的历史记录中,表单页面的请求是GET请求(初始加载表单的请求),而不是POST请求。当用户点击返回按钮时,浏览器会发送GET请求加载表单页面,自然显示空的新表单,不会出现旧数据或重复提交的提示。
  • 移除form = ContactsForm():因为重定向后会触发新的GET请求,进入else分支重新初始化空表单,所以这行代码完全没必要保留。

额外注意事项

  • 确保你在urls.py中给主页面的URL配置了正确的name参数(比如name='home'),这样reverse才能正确解析到主页面的路径。
  • 如果主页面的URL不需要动态参数,也可以直接写硬编码的路径(比如return HttpResponseRedirect('/')),但用reverse更符合Django的最佳实践,便于后续URL修改。

内容的提问来源于stack exchange,提问作者Asif Shahzad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:35:25