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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:58:25