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

如何在Django中实现管理员审核后自动创建用户并发送登录信息

实现流程拆解

核心思路是把求职申请收集和用户账号创建完全拆分开:先存储未审核的申请信息,等管理员通过审核后,再自动生成账号并通知求职者。

1. 拆分申请与用户账号模型

原来的代码直接关联User模型创建账号,现在先做独立的申请模型,审核前不生成用户:

from django.db import models
from django.contrib.auth import get_user_model

User = get_user_model()

class InterpreterApplication(models.Model):
    # 求职者基础信息
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
    address = models.TextField()
    phone_number = models.CharField(max_length=15)
    ssn = models.CharField(max_length=15, blank=True)
    # 技能信息
    languages = models.ManyToManyField('Language')
    # 审核状态标记
    STATUS_CHOICES = [
        ('pending', '待审核'),
        ('approved', '已通过'),
        ('rejected', '已拒绝'),
    ]
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
    applied_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.first_name} {self.last_name} - {self.status}"

2. 制作求职申请表单

表单只收集申请信息,完全去掉密码相关字段:

from django import forms
from .models import InterpreterApplication

class InterpreterApplicationForm(forms.ModelForm):
    languages = forms.ModelMultipleChoiceField(
        queryset=Language.objects.all(),
        widget=forms.CheckboxSelectMultiple
    )

    class Meta:
        model = InterpreterApplication
        fields = [
            'first_name', 'last_name', 'email',
            'address', 'phone_number', 'ssn', 'languages'
        ]

3. 处理申请提交视图

接收求职者提交的表单,直接保存为待审核的申请记录:

from django.shortcuts import render, redirect
from .forms import InterpreterApplicationForm

def apply_interpreter(request):
    if request.method == 'POST':
        form = InterpreterApplicationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('application_success')  # 跳转到申请成功提示页面
    else:
        form = InterpreterApplicationForm()
    return render(request, 'apply_interpreter.html', {'form': form})

4. 管理员审核与账号生成

快速实现:用Django Admin

把申请模型注册到Admin,自定义审核操作,一键生成账号并发邮件:

from django.contrib import admin
from django.contrib.auth import get_user_model
from django.core.mail import send_mail
import random
import string
from .models import InterpreterApplication, Interpreter

User = get_user_model()

class InterpreterApplicationAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'email', 'status', 'applied_at')
    list_filter = ('status', 'applied_at')
    actions = ['approve_applications', 'reject_applications']

    def approve_applications(self, request, queryset):
        for application in queryset:
            if application.status != 'approved':
                # 生成唯一用户名(用邮箱前缀,重复就加随机数字)
                username = application.email.split('@')[0]
                while User.objects.filter(username=username).exists():
                    username += ''.join(random.choices(string.digits, k=3))
                # 生成8位随机初始密码
                password = ''.join(random.choices(string.ascii_letters + string.digits, k=8))

                # 创建用户账号
                user = User.objects.create_user(
                    username=username,
                    email=application.email,
                    first_name=application.first_name,
                    last_name=application.last_name,
                    password=password,
                    is_interpreter=True
                )

                # 创建关联的Interpreter记录
                interpreter = Interpreter.objects.create(
                    user=user,
                    address=application.address,
                    phone_number=application.phone_number
                )
                interpreter.languages.set(application.languages.all())

                # 更新申请状态
                application.status = 'approved'
                application.save()

                # 发送登录信息邮件
                subject = '你的口译员申请已通过审核'
                message = f"""
                恭喜你!申请已通过,以下是你的登录信息:
                用户名:{username}
                初始密码:{password}
                请登录后及时修改密码。
                """
                send_mail(subject, message, 'your-admin-email@example.com', [application.email])

        self.message_user(request, '已完成选中申请的审核,账号已创建并通知求职者')

    approve_applications.short_description = '通过选中的申请'

    def reject_applications(self, request, queryset):
        queryset.update(status='rejected')
        # 可选:添加拒绝通知邮件逻辑
        self.message_user(request, '已将选中申请标记为拒绝')

    reject_applications.short_description = '拒绝选中的申请'

admin.site.register(InterpreterApplication, InterpreterApplicationAdmin)

定制化实现:自定义审核视图

如果需要更个性化的审核页面,自己写视图和模板即可,核心逻辑和上面的Admin Action一致,重点是权限控制(只允许管理员访问)。

5. 用户修改登录信息

直接用Django自带的密码修改功能,在URL配置中添加:

from django.contrib.auth import views as auth_views

urlpatterns = [
    # ... 其他URL配置
    path('accounts/password_change/', auth_views.PasswordChangeView.as_view(template_name='password_change.html'), name='password_change'),
    path('accounts/password_change/done/', auth_views.PasswordChangeDoneView.as_view(template_name='password_change_done.html'), name='password_change_done'),
]

如果需要让用户修改用户名、邮箱,写个简单的User表单视图即可。

关键注意事项

  • 邮件配置:在settings.py中设置EMAIL_BACKEND、EMAIL_HOST等参数,测试阶段可以用console.EmailBackend把邮件内容打印到控制台。
  • 安全性:随机密码要足够复杂,避免简单组合;审核操作必须加管理员权限验证。
  • 唯一性:用户名生成逻辑要确保不重复,避免创建用户时抛出异常。

内容的提问来源于stack exchange,提问作者KingDaniel Maliro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:43:17