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

Django创建CustomUser时出现sqlite3无password列等错误如何解决?

问题根源与解决步骤

1. 迁移报错+admin路径找不到password字段问题

两个问题属于同源问题,原因如下:

  • 你继承的AbstractBaseUser类已经内置了加密存储的password字段,无需自定义password1字段,Django认证、admin后台的默认逻辑都会读取该内置字段,你额外定义的password1属于冗余字段,且设置的长度10也无法存储加密后的密码串。
  • 之前的迁移操作因为非空password字段没有默认值卡住未执行成功,导致数据库的customusers表中没有生成password字段,访问admin时就会抛出字段不存在的错误。

解决方法:
首先修改CustomUsers模型代码,删除冗余的password1字段,补充必要的内置字段定义:

class CustomUsers(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(max_length=40, unique=True)
    email = models.EmailField()
    # 补充admin需要的基础字段
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    objects = CustomUserManager()
    USERNAME_FIELD = 'username'
    # 可选设置邮箱为必填字段
    REQUIRED_FIELDS = ['email']

如果是开发阶段无重要生产数据,直接重置迁移和数据库即可解决问题:

  • 删除loginsignup应用下migrations目录中除__init__.py外的所有文件
  • 删除项目根目录下的sqlite3数据库文件(默认名为db.sqlite3)
  • 重新执行迁移命令:
    python manage.py makemigrations
    python manage.py migrate
    
  • 重新创建超级用户:python manage.py createsuperuser

2. 注册表单提交报错CustomUserManager has no attribute 'objects'

属于调用逻辑错误:objects是绑定在CustomUsers模型类上的管理器实例,不是CustomUserManager类的属性。
解决方法:
修改forms.py中第42行的代码,将:

user = CustomUserManager.objects.create_user(

改为:

user = CustomUsers.objects.create_user(

3. CustomUserManager逻辑漏洞修正

当前代码存在两个逻辑问题:

  • create_user方法中normalize_email是管理器的内置方法,不是字符串的方法,调用写法错误
  • create_superuser方法仅设置了参数,没有调用创建逻辑,用户无法正常保存

修正后的完整代码:

class CustomUserManager(BaseUserManager):
    def create_user(self, username, email, password, **other_fields):
        # 修正normalize_email调用方式
        email = self.normalize_email(email)
        user = self.model(email=email, username=username, **other_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, username, email, password, **other_fields):
        other_fields.setdefault('is_staff', True)
        other_fields.setdefault('is_superuser', True)
        other_fields.setdefault('is_active', True)
        # 补充创建超级用户的调用逻辑
        return self.create_user(username, email, password, **other_fields)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 14:54:04