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

