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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:27:04