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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:01:28