无法使用扩展的AbstractBaseUser模型登录
问题描述:
我正在使用 Django 2.0
我已经扩展了 AbstractBaseUser
以对电子邮件进行一些修改,并使用电子邮件作为用户名
I have extended the AbstractBaseUser
to make some modification to the email and use email as username
class UserManager(BaseUserManager):
def create_user(self, email, password=None, is_staff=False, is_superuser=False):
if not email:
raise ValueError('User must have an email address')
if not password:
raise ValueError('User must have a password')
user = self.model(
email=self.normalize_email(email)
)
user.is_staff = is_staff
user.is_superuser = is_superuser
user.set_password(password)
user.save(using=self._db)
return user
def create_staffuser(self, email, password=None):
return self.create_user(
email,
password=password,
is_staff=True
)
def create_superuser(self, email, password=None):
return self.create_user(
email,
password=password,
is_staff=True,
is_superuser=True
)
class User(AbstractBaseUser):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
email = models.EmailField(max_length=250, blank=False, unique=True)
first_name = models.CharField(max_length=150, blank=True)
last_name = models.CharField(max_length=150, blank=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
groups = models.ManyToManyField(Group, blank=True)
last_login = models.DateTimeField(auto_now=True)
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'email'
objects = UserManager()
@property
def staff(self):
return self.is_staff
@property
def active(self):
return self.is_active
@property
def superuser(self):
return self.is_superuser
def __str__(self):
if self.first_name is not None:
return self.get_full_name()
return self.email
def get_full_name(self):
if self.last_name is not None:
return self.first_name + ' ' + self.last_name
return self.get_short_name()
def get_short_name(self):
return self.first_name
我跑了
python manage.py makemigrations
python manage.py migrate
并使用创建了超级管理员
and created superadmin using
python manage.py createsuperuser
超级用户创建成功.
但是当我使用 127.0.0.1:8000/admin/
我给
Please enter the correct email and password for a staff account.
Note that both fields may be case-sensitive.
代码有什么问题?
答
您需要定义 has_perm
和 has_module_perms
方法:
def has_perm(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True
def has_module_perms(self, app_label):
"Does the user have permissions to view the app `app_label`?"
# Simplest possible answer: Yes, always
return True