Django中AbstractUser无法调用set_password()等方法的问题
问题原因及解决办法
1. form.save(commit=False)无法调用set_password()的原因
你自定义的用户模型没有继承Django内置的AbstractBaseUser,这个基类封装了set_password()、check_password()这类密码管理的核心方法。如果你的用户模型只继承了models.Model,自然没有这些方法。
2. BaseUserManager中self.model()无set_password()和save()的原因
self.model指向的是你关联的用户模型,如果用户模型本身没继承AbstractBaseUser,实例化后自然没有set_password()方法;save()是模型实例的基础方法,要是无法调用,大概率是用户模型的继承链有问题——比如没正确继承models.Model或AbstractBaseUser。
正确配置自定义用户模型的步骤
- 自定义用户模型必须继承
AbstractBaseUser和PermissionsMixin(后者负责权限相关功能):
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin from django.db import models class CustomUser(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True) username = models.CharField(max_length=100) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) USERNAME_FIELD = 'email' # 设置唯一标识字段 REQUIRED_FIELDS = ['username'] # 创建超级用户时必填的字段 objects = CustomUserManager()
- 自定义用户管理器继承
BaseUserManager,并实现创建用户和超级用户的方法:
from django.contrib.auth.base_user import BaseUserManager class CustomUserManager(BaseUserManager): def create_user(self, email, username, password=None, **extra_fields): if not email: raise ValueError('用户必须提供邮箱') email = self.normalize_email(email) user = self.model(email=email, username=username, **extra_fields) # 此时user是AbstractBaseUser的实例,可以正常调用set_password user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, username, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) return self.create_user(email, username, password, **extra_fields)
- 在
settings.py中指定自定义用户模型:
AUTH_USER_MODEL = '你的应用名.CustomUser'
内容的提问来源于stack exchange,提问作者user15746554
相关产品推荐
相关产品推荐

