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

如何防止Django用户重复提交同一表单 提交后仅可预览已提交内容

Django 禁止用户重复提交表单实现方案

第一步:调整模型结构,关联提交用户

当前Membership模型没有和提交用户绑定,无法区分不同用户的提交记录,首先需要新增用户关联字段并增加唯一约束,保证每个用户仅能提交一条记录:

# models.py
from django.contrib.auth.models import User
from django.db import models

class Membership(models.Model):
    # 新增关联用户字段,一对一关联保证每个用户仅能有一条提交记录
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="membership")
    fullname = models.CharField(max_length=500, blank=True, null=True)
    location = models.IntegerField(default=0,blank=True, null=True)
    department = models.IntegerField(default=0,blank=True, null=True)
    last_update = models.DateTimeField(auto_now_add=False, auto_now=True)

    def __str__(self):
        return  str(self.fullname)

注意:修改模型后需要执行python manage.py makemigrations和python manage.py migrate同步表结构变更

第二步:修改视图逻辑,拦截重复提交

视图层提前校验当前登录用户的提交状态,若已提交过则直接返回预览数据,拦截后续提交逻辑:

# views.py
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
from .models import Membership
from .forms import MembershipForm

# 要求登录才能访问该页面,否则无法识别用户身份
@login_required
def index(request):
    # 优先查询当前用户是否已有提交记录
    existing_membership = Membership.objects.filter(user=request.user).first()
    # 已提交过,直接返回预览数据,不走表单逻辑
    if existing_membership:
        return render(request, 'index.html', {'membership': existing_membership})
    
    form = MembershipForm()
    if request.method == 'POST':
        form = MembershipForm(request.POST)
        if form.is_valid():
            # 保存前绑定当前登录用户
            membership = form.save(commit=False)
            membership.user = request.user
            membership.save()
            return redirect("home")
    return render(request, 'index.html', {'form': form})

第三步:调整模板适配展示逻辑

模板层根据传入的参数判断展示表单还是预览内容:

<!-- index.html -->
{% if membership %}
<h3>你已提交过会员申请,提交内容如下:</h3>
<ul>
    <li>姓名:{{ membership.fullname }}</li>
    <li>所在地:{{ membership.location }}</li>
    <li>所属部门:{{ membership.department }}</li>
    <li>最后更新时间:{{ membership.last_update }}</li>
</ul>
{% else %}
<!-- 原来的表单渲染代码 -->
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交</button>
</form>
{% endif %}

可选补充防护

如果需要防止用户短时间内重复点击提交按钮导致的重复提交,可在前端给提交按钮绑定点击事件,点击后立即禁用按钮,避免多次触发提交请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:06:02