请输入正确的员工账号邮箱和密码

问题描述 投票:0回答:1

我使用

python manage.py createsuperuser
创建了超级用户,我确信 is_staff = True, is_superuser = True,is_active = True。

我使用了自定义用户,这里是 models.py:

from django.db import models
from django.contrib.auth.hashers import make_password
from django.contrib.auth.models import AbstractUser, Group, Permission, UserManager    


class CustomUserManager(UserManager):
    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')
        return self.create_user(email, password, **extra_fields)
    
    def _create_user(self, email, password, **extra_fields):
            email = self.normalize_email(email)
            user  = self.model(email=email, **extra_fields)
            user.password = make_password(password)
            user.save(using=self._db)
            return user
        
    def create_user(self, email, password=None, **extra_fields):
            extra_fields.setdefault('is_staff', False)
            extra_fields.setdefault('is_superuser', False)
            return self._create_user(email, password, **extra_fields)
        
        

class User(AbstractUser):
    email    = models.EmailField(max_length=254, unique=True)
    username = None
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = [] 
    objects = CustomUserManager() # use the custom manager
    
    def __str__(self):
        return self.email

为什么无法登录管理面板?

django django-admin django-users
1个回答
0
投票

简短回答:问题出在您的

create_superuser
方法内。

您可以通过调用

self.create_user
来完成该方法,而您应该调用
self._create_user
(注意前面的下划线)

进行更改后,您的代码将起作用,并且您将能够登录管理面板。解释如下。


长答案: 当您调用

self.create_user(email, password, **extra_fields)
时,当前的
create_user
方法将始终将
is_staff
is_superuser
extra_fields 覆盖为 False,即使您将它们作为 True 传递给函数。 见下图:

class CustomUserManager(UserManager):
    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)  ## IS TRUE HERE
        extra_fields.setdefault('is_superuser', True)  ## IS TRUE HERE
        extra_fields.setdefault('is_active', True)  ## IS TRUE HERE & WILL REMAIN SO

        if extra_fields.get('is_staff') is not True:  ## STILL TRUE
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:  ## STILL TRUE
            raise ValueError('Superuser must have is_superuser=True.')
        return self.create_user(email, password, **extra_fields)  ## STILL TRUE 
    
    def _create_user(self, email, password, **extra_fields): 
            email = self.normalize_email(email)
            user  = self.model(email=email, **extra_fields)
            user.password = make_password(password)
            user.save(using=self._db)
            return user
        
    def create_user(self, email, password=None, **extra_fields):  ## BOTH TRUE
            extra_fields.setdefault('is_staff', False)  ## IS STAFF NOW FALSE !!! 
            extra_fields.setdefault('is_superuser', False)  ## IS SUPERUSER NOW FALSE
            return self._create_user(email, password, **extra_fields)  ## SENT TO _CREATE_USER AS FALSE 

如果您进行以下更改,它应该会起作用:

class CustomUserManager(UserManager):
    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')
        return self._create_user(email, password, **extra_fields)  ## CHANGE HERE!
    
    def _create_user(self, email, password, **extra_fields):
            email = self.normalize_email(email)
            user  = self.model(email=email, **extra_fields)
            user.password = make_password(password)
            user.save(using=self._db)
            return user
        
    def create_user(self, email, password=None, **extra_fields):
            extra_fields.setdefault('is_staff', False)
            extra_fields.setdefault('is_superuser', False)
            return self._create_user(email, password, **extra_fields)

现在应该可以了,如果不行请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.