Django自定义BaseUserManager的create_user未执行、create_superuser正常是什么原因?
问题根源
你注册普通用户时走的RegistrationForm默认save()逻辑,没有调用自定义用户管理器的create_user方法,而是直接实例化Account模型对象后保存,因此你写在create_user里的generate_userTag逻辑完全没被触发,甚至你故意加的ValueError也不会触发。
而python manage.py createsuperuser命令是Django官方封装的逻辑,会主动调用你自定义管理器的create_superuser方法,你的create_superuser内部又调用了create_user,所以超级用户的创建流程完全符合预期。
解决方案
方案一:修改RegistrationForm的save方法(最推荐)
找到你定义RegistrationForm的代码,重写它的save方法,主动调用create_user创建用户即可复用你写好的逻辑:
from django.contrib.auth.forms import UserCreationForm from .models import Account class RegistrationForm(UserCreationForm): # 保留你原本的表单字段、校验规则等代码 def save(self, commit=True): user = Account.objects.create_user( email=self.cleaned_data["email"], username=self.cleaned_data["username"], password=self.cleaned_data["password1"] ) # 有其他需要处理的表单字段可以在这里额外赋值 if commit: user.save() return user
方案二:重写Account模型的save方法(备选)
如果不想修改表单逻辑,也可以把userTag的生成逻辑下沉到模型层,确保只要创建用户就会自动生成:
class Account(AbstractBaseUser): # 保留你原本的所有字段定义 def save(self, *args, **kwargs): # 只在首次创建用户时生成userTag,避免后续修改用户信息时覆盖旧值 if not self.pk: self.userTag = generate_userTag(self.username) super().save(*args, **kwargs)
内容的提问来源于stack exchange,提问作者M4GI3R
相关产品推荐
相关产品推荐

