员工用户无法登录到 django 管理面板

Staff user can't login to django admin panel

我正在尝试在我的 Django 应用程序中创建自定义用户模型。但是每当我尝试这样做时,我都无法使用管理面板中“超级用户”创建的“员工用户”登录。它说:

“请输入正确的员工帐户用户名和密码。请注意,这两个字段可能区分大小写。”

应用程序名称:后端

Backend/models.py

from django.db import models
from django.contrib.auth.models import (
    AbstractBaseUser,
    BaseUserManager
)
# Create your models here.
class UserManager(BaseUserManager):
    
    def create_user(
        self,
        username = None,
        email = None,
        password = None,
        is_active = True,
        is_staff = False,
        is_admin = False
    ):
        if not username:
            raise ValueError("Users must have a username")
        if not password:
            raise ValueError("Users must have a password")
        if not email:
            raise ValueError("Users must have a email")
        
        user_obj = self.model(
            username = username
        )
        user_obj.email = self.normalize_email(email)
        user_obj.set_password(password)
        user_obj.is_active = is_active
        user_obj.is_staff = is_staff
        user_obj.is_admin = is_admin
        user_obj.save(using=self._db)
        return user_obj
        
    def create_staffuser(self, username, email, password):
        user_obj = self.create_user(
            username = username,
            email = email,
            password = password,
            is_staff = True
        )
        return user_obj
    
    def create_superuser(self, username, email, password):
        user_obj = self.create_user(
            username = username,
            email = email,
            password = password,
            is_staff = True,
            is_admin = True
        )
        return user_obj
        
class User(AbstractBaseUser):
    
    username = models.CharField(max_length=255, unique=True)
    email = models.EmailField(max_length=255, unique=True)
    is_active = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    
    objects = UserManager()
    USERNAME_FIELD = "username"
    REQUIRED_FIELDS = ["email"]
    
    def __str__(self):
        return self.username
        
    def get_full_name(self):
        return self.username
    
    def get_short_name(self):
        return self.username 
    
    def has_module_perms(self, app_label):
        return True 
    
    def has_perm(self, perm, ob=None):
        return True
    
        

Backend/admin.py

from django.contrib import admin
from Backend.models import(
    User
)
# Register your models here.
admin.site.register(User)

我将这些行添加到 settings.py


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # my application
    'Backend'
]

# added lines
AUTH_USER_MODEL = "Backend.User"
AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
)

提前致谢。

is_staff 需要设置为 True 用户才能登录

我遇到了类似的问题,发现在管理界面创建新用户时密码没有被散列。使用自定义用户模型时,您需要为其注册正确的 ModelAdmin,即 django.contrib.auth.admin.UserAdmin:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from Backend.models import(
    User
)

admin.site.register(User, UserAdmin)

ModelAdmin 对象实现 Django 管理站点的逻辑,而身份验证逻辑由 auth 应用程序的 UserAdmin 实现。 admin.site.register(User) 将为 User 创建一个默认值 ModelAdmin,它只在其上实现简单的 CRUD 操作,这就是密码在我的情况下没有被散列的原因,这使得它总是 return稍后尝试登录时出现密码错误错误(因为假定存储的密码经过哈希处理)。此外,管理器不用于在管理站点中创建新对象。