如何在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
相关产品推荐
相关产品推荐

