如何防止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
相关产品推荐
相关产品推荐

