Django表单提交后刷新页面数据重复问题的解决方法
解决Django表单提交后刷新重复添加数据的问题
问题原因
你当前的实现中,add_submit视图处理完POST提交后直接渲染图书列表页面。当用户刷新这个页面时,浏览器会重新发送之前的POST请求,导致数据库重复插入相同的图书数据。
解决方案:采用PRG模式(Post/Redirect/Get)
处理完POST请求后,不要直接返回渲染的页面,而是重定向到一个GET请求的图书列表页面。这样刷新时浏览器只会发送GET请求,不会触发重复提交逻辑。
1. 修改视图函数(views.py)
将add_submit中的返回逻辑改为重定向,同时确保有一个专门处理GET请求的图书列表视图:
from django.shortcuts import redirect, render from django.contrib import messages # 可选,用于添加成功提示 def add_submit(request): if request.method =='POST': title=request.POST.get('t_title') author_name=request.POST.get('a_author') author, created=Author.objects.get_or_create(Name=author_name) summary=request.POST.get('s_summary') date=request.POST.get('d_date') book=Book(Title=title,Author=author,Summary=summary,Published_date=date) book.save() # 可选:添加成功提示消息 messages.success(request, "图书已成功添加") # 重定向到图书列表视图(对应urls中name为'book'的路径) return redirect('library:book') # 确保图书列表视图处理GET请求,返回所有图书 def book(request): books = Book.objects.all() return render(request, 'books.html', {'books': books})
2. 确认URL配置(urls.py)
你的现有URL配置已经包含path('book/',views.book,name='book'),无需额外修改,表单的action仍指向library:add_submit即可。
3. 可选:在模板中显示提示消息
如果使用了messages框架,在图书列表模板(books.html)中添加消息展示代码:
{% if messages %} {% for message in messages %} <div class="alert alert-success">{{ message }}</div> {% endfor %} {% endif %} <!-- 原有的图书列表展示代码 -->
原理说明
重定向后,浏览器地址栏会更新为图书列表页的URL(如/book/),此时刷新页面时,浏览器发送的是GET请求到该URL,只会重新加载图书列表,不会触发图书添加的POST逻辑,彻底避免了重复提交问题。
内容的提问来源于stack exchange,提问作者user21134785
相关产品推荐
相关产品推荐

