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

如何限制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:10:02