Django中实现用户需管理员审核注册及组选择功能的方法问询
嘿,这个需求在团队协作类的Django应用里挺典型的,我来一步步帮你梳理实现思路和具体代码~
一、核心模型设计(先把数据结构搭好)
首先得扩展默认的用户模型,同时新增组、用户组关联表来存储审核状态:
from django.contrib.auth.models import AbstractUser from django.db import models # 扩展用户模型,增加账号状态字段 class User(AbstractUser): ACCOUNT_STATUS_CHOICES = ( ('PENDING', '待审核'), ('ACTIVE', '已激活'), ('REJECTED', '已拒绝'), ) account_status = models.CharField(max_length=20, choices=ACCOUNT_STATUS_CHOICES, default='PENDING') # 组模型,记录组名和管理员 class Group(models.Model): name = models.CharField(max_length=100, unique=True) # 组名唯一,避免重复创建 admin = models.ForeignKey(User, on_delete=models.CASCADE, related_name='managed_groups') # 用户组关联表,记录用户加入组的状态 class UserGroup(models.Model): USER_GROUP_STATUS_CHOICES = ( ('PENDING', '待审核'), ('APPROVED', '已通过'), ('REJECTED', '已拒绝'), ) user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='group_memberships') group = models.ForeignKey(Group, on_delete=models.CASCADE, related_name='members') status = models.CharField(max_length=20, choices=USER_GROUP_STATUS_CHOICES, default='PENDING') class Meta: unique_together = ('user', 'group') # 一个用户不能重复申请同一个组
二、注册表单与视图逻辑(处理用户注册的核心流程)
接下来做注册表单,让用户输入基本信息和组名,然后在视图里判断组是否存在,分情况处理:
1. 注册表单
from django import forms from django.contrib.auth.forms import UserCreationForm from .models import User class RegistrationForm(UserCreationForm): group_name = forms.CharField(label='所属组名', max_length=100, help_text='如果组不存在,系统会自动创建并让你成为管理员') class Meta: model = User fields = ('username', 'email', 'password1', 'password2', 'group_name') # 可以在这里加组名的自定义验证,比如禁止特殊字符 def clean_group_name(self): group_name = self.cleaned_data.get('group_name').strip() if not group_name: raise forms.ValidationError('组名不能为空') return group_name
2. 注册视图
from django.shortcuts import render, redirect from django.contrib.auth import login from .forms import RegistrationForm from .models import Group, UserGroup def register(request): if request.method == 'POST': form = RegistrationForm(request.POST) if form.is_valid(): user = form.save(commit=False) # 先不保存用户,处理组的逻辑 group_name = form.cleaned_data.get('group_name') # 检查组是否存在,不存在则创建 group, is_new_group = Group.objects.get_or_create(name=group_name) if is_new_group: # 新组:把当前用户设为管理员,直接激活账号 group.admin = user group.save() user.account_status = 'ACTIVE' user.is_active = True # 用Django默认的is_active也可以,看你习惯 user.save() # 建立用户-组关联,状态设为已通过 UserGroup.objects.create(user=user, group=group, status='APPROVED') # 自动登录用户 login(request, user) return redirect('home') # 跳转到首页 else: # 已有组:用户进入待审核状态,保存用户但不激活 user.account_status = 'PENDING' user.is_active = False user.save() # 创建待审核的关联记录 UserGroup.objects.create(user=user, group=group, status='PENDING') # 这里可以加邮件通知组管理员的逻辑(比如用Django的send_mail) return redirect('registration_pending') # 跳转到待审核提示页 else: form = RegistrationForm() return render(request, 'registration/register.html', {'form': form})
三、管理员审核功能实现
需要给组管理员做一个审核页面,处理用户的加入申请:
1. 权限校验装饰器
先写一个装饰器,判断当前用户是否是组管理员:
from django.contrib.auth.decorators import user_passes_test def is_group_admin(user): # 检查用户是否管理至少一个组 return user.is_authenticated and user.managed_groups.exists()
2. 审核列表与操作视图
from django.shortcuts import get_object_or_404, redirect from .models import UserGroup, User @user_passes_test(is_group_admin) def review_requests(request): # 获取当前管理员负责的组的待审核申请 pending_requests = UserGroup.objects.filter(group__admin=request.user, status='PENDING') return render(request, 'admin/review_requests.html', {'pending_requests': pending_requests}) @user_passes_test(is_group_admin) def approve_request(request, request_id): # 审核通过:更新关联状态,激活用户账号 user_group = get_object_or_404(UserGroup, id=request_id, group__admin=request.user) user_group.status = 'APPROVED' user_group.save() user = user_group.user user.account_status = 'ACTIVE' user.is_active = True user.save() # 可选:发送邮件通知用户审核通过 return redirect('review_requests') @user_passes_test(is_group_admin) def reject_request(request, request_id): # 审核拒绝:更新关联状态,标记用户账号为拒绝 user_group = get_object_or_404(UserGroup, id=request_id, group__admin=request.user) user_group.status = 'REJECTED' user_group.save() user = user_group.user user.account_status = 'REJECTED' user.save() # 可选:发送邮件通知用户审核拒绝 return redirect('review_requests')
四、登录权限控制(确保只有审核通过的用户能登录)
可以自定义认证后端,限制只有已激活的用户才能登录:
from django.contrib.auth.backends import ModelBackend from .models import User class CustomAuthBackend(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): try: user = User.objects.get(username=username) # 验证密码+账号状态是否为已激活 if user.check_password(password) and user.account_status == 'ACTIVE': return user return None except User.DoesNotExist: return None
然后在settings.py里配置这个后端:
AUTHENTICATION_BACKENDS = [ 'your_app_name.backends.CustomAuthBackend', 'django.contrib.auth.backends.ModelBackend', # 保留默认后端作为 fallback ]
五、额外优化建议
- 可以给用户组关联表加
created_at字段,记录申请时间 - 审核通知可以用Django的信号(signals)来触发,比如用户提交申请后自动发邮件给管理员
- 可以在用户个人中心显示申请状态
- 如果组很多,可以给注册表单的组名加自动补全功能(用jQuery UI或者Django-autocomplete-light)
内容的提问来源于stack exchange,提问作者Thales
相关产品推荐
相关产品推荐

