如何限制Django员工用户重复填写生物数据表单?
Django 限制员工仅能查看一次生物数据表单的实现方案
1. 扩展员工/用户模型,添加提交状态字段
假设你有自定义的Employee模型(若使用默认User模型,可通过OneToOne关联扩展),新增布尔字段标记是否已提交生物数据:
# models.py from django.db import models from django.contrib.auth.models import User class Employee(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) has_submitted_biodata = models.BooleanField(default=False) # 其他生物数据字段(如姓名、联系方式等)...
首次添加该字段后,需执行迁移命令:
python manage.py makemigrations python manage.py migrate
2. 编写视图逻辑,实现访问限制
类似is_authenticated的验证思路,通过检查用户关联的Employee实例状态,控制表单页面的访问权限:
# views.py from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.decorators import login_required from .forms import BiodataForm from .models import Employee @login_required def biodata_form(request): # 获取当前用户关联的Employee实例,无则创建(可根据业务调整) employee, created = Employee.objects.get_or_create(user=request.user) # 若已提交过表单,直接跳转至修改页面 if employee.has_submitted_biodata: return redirect('update_biodata', employee_id=employee.id) if request.method == 'POST': form = BiodataForm(request.POST, instance=employee) if form.is_valid(): form.save() # 标记为已提交 employee.has_submitted_biodata = True employee.save() return redirect('update_biodata', employee_id=employee.id) else: form = BiodataForm(instance=employee) return render(request, 'biodata_form.html', {'form': form}) @login_required def update_biodata(request, employee_id): employee = get_object_or_404(Employee, id=employee_id, user=request.user) # 双重验证:未提交过的用户无法访问修改页面 if not employee.has_submitted_biodata: return redirect('biodata_form') if request.method == 'POST': form = BiodataForm(request.POST, instance=employee) if form.is_valid(): form.save() return redirect('update_biodata', employee_id=employee.id) else: form = BiodataForm(instance=employee) return render(request, 'update_biodata.html', {'form': form})
3. 配置URL路由
将两个视图映射到对应的URL:
# urls.py from django.urls import path from . import views urlpatterns = [ path('biodata/', views.biodata_form, name='biodata_form'), path('biodata/update/<int:employee_id>/', views.update_biodata, name='update_biodata'), ]
4. 模板适配(可选)
- 空表单页面
biodata_form.html无需额外处理,仅未提交的用户可见 - 修改页面
update_biodata.html可添加提示说明:
<h1>修改你的生物数据</h1> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">保存修改</button> </form>
核心逻辑说明
和is_authenticated的验证思路一致:通过检查用户的状态字段控制访问权限——前者验证用户是否登录,后者验证用户是否已提交过生物数据。提交表单后立即更新状态,确保用户无法再访问空表单;修改页面的双重验证则防止用户手动输入URL绕过限制。
内容的提问来源于stack exchange,提问作者Raji Muhammad
相关产品推荐
相关产品推荐

