如何解决Django页面刷新后重复添加注册记录问题
解决Django表单刷新重复提交记录的问题
问题描述
开发的学生注册表单可收集姓名、性别、地址、出生日期(dob)、州/邦信息。提交表单后页面显示「记录已添加」提示并重置为空表单,但刷新页面时会重复添加相同记录,每刷新一次新增一条重复数据。需实现仅在点击提交按钮时添加记录的Django解决方案。
核心解决方案:Post/Redirect/Get (PRG) 模式
问题根源是表单提交后直接返回渲染页面,浏览器保留POST请求历史,刷新时会重新发送POST请求导致重复保存。采用PRG模式,提交成功后重定向到GET请求页面,避免重复提交。
修改后的 views.py 代码
def std_registration_view(request, username): if 'UserIsActive' in request.session: # 实例化表单,原代码此处未加括号,属于不规范写法 form = Student_Registration() if request.method == "POST": form = Student_Registration(request.POST, request.FILES) if form.is_valid(): form.save() name = form.cleaned_data['full_name'] messages.success(request, "Record is added for " + name) # 提交成功后重定向到注册页面(GET请求),传递username参数 return redirect('stdregistration', username=username) return render(request, 'std_registration/registration.html', {"username": username, 'form': form}) return redirect('login')
关键修改说明
- 替换直接渲染为重定向:表单验证通过并保存后,不再使用
render返回页面,而是用redirect跳转到注册页面的URL(对应stdregistration路由)。 - 修复表单实例化问题:原代码中
form=Student_Registration是引用类而非实例化,改为form=Student_Registration()确保表单正常初始化。 - 保留提示信息:通过Django的
messages框架传递成功提示,重定向后依然能在模板中正常显示。
效果验证
- 提交表单后,页面自动重定向到注册页面,表单重置为空,「记录已添加」提示正常显示。
- 刷新页面时,浏览器仅发送GET请求加载注册页面,不会触发表单提交逻辑,彻底避免重复添加记录。
内容的提问来源于stack exchange,提问作者Nugget
相关产品推荐
相关产品推荐

