Can';t登录到Django管理面板

Can';t登录到Django管理面板,django,django-rest-framework,Django,Django Rest Framework,Made custom user,Made custom user manager,无法登录到Django管理面板 已尝试(表示不提供): manage.py已同步 manage.py createsuperuser 已检查我的用户是否为工作人员且处于活动状态 将身份验证\u后端设置为“django.contrib.auth.BACKENDS.modelbend” 设置AUTH\u USER\u MODEL='users.USER' DB-postgres,im也使用rest框架 mode

Made custom user,Made custom user manager,无法登录到Django管理面板

已尝试(表示不提供):

  • manage.py已同步
  • manage.py createsuperuser
  • 已检查我的用户是否为工作人员且处于活动状态
  • 将身份验证\u后端设置为“django.contrib.auth.BACKENDS.modelbend”
  • 设置AUTH\u USER\u MODEL='users.USER'
DB-postgres,im也使用rest框架

models.py

from django.contrib.auth.base_user import BaseUserManager, AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.db import models, transaction


# Create your models here.
class UserManager(BaseUserManager):
    """
    Custom user model manager where email is the unique identifiers
    for authentication instead of usernames.
    """

    def create_user(self, deviceId, **extra_fields):
        """
        Create and save a User with the given email and password.
        """
        if not deviceId:
            raise ValueError('The device id must be set')

        user = self.model(deviceId=deviceId, **extra_fields)
        user.save()
        return user

    def create_superuser(self, deviceId, **extra_fields):
        """
        Create and save a SuperUser with the given email and password.
        """
        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(deviceId, **extra_fields)


class User(AbstractBaseUser, PermissionsMixin):
    deviceId = models.TextField(max_length=255, unique=True, db_column='device_id')
    email = models.EmailField(max_length=255, unique=True, null=True)
    password = models.CharField(max_length=255, blank=True, null=True)
    name = models.CharField(max_length=255, db_column='name')
    fcmToken = models.TextField(blank=True, null=True, db_column='fcm_token')
    picture = models.ImageField(upload_to='UserAvatars', null=True)
    pictureUrl = models.URLField(null=True, blank=True, db_column='picture_url')

    emailToken = models.TextField(max_length=255, db_column='email_token', blank=True, null=True)
    appleId = models.TextField(max_length=255, db_column='apple_id', blank=True, null=True)
    googleId = models.TextField(max_length=255, db_column='google_id', blank=True, null=True)
    facebookId = models.TextField(max_length=255, db_column='facebook_id', blank=True, null=True)

    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'deviceId'
    REQUIRED_FIELDS = []

    def save(self, *args, **kwargs):
        super(User, self).save(*args, **kwargs)
        return self

    def get_full_name(self):
        return self.name

    def get_short_name(self):
        return self.name

问题是在
create\u user
方法中没有正确处理密码。密码显然应该是散列的。当您编写
self.model(deviceId=deviceId,**额外字段)
时,您只需将从用户收到的纯文本值设置为密码

当一个人试图验证Django时,他会对收到的密码进行哈希运算,并尝试将其与数据库中的值相匹配,这显然会失败。作为参考检查,它是如何在内置用户模型中设置密码的

要解决此问题,您必须更改
create\u user
create\u superuser
方法,如下所示:

从django.contrib.auth.hasher导入make\u密码
def create_user(自我、设备ID、密码、**额外_字段):
"""
使用给定的电子邮件和密码创建并保存用户。
"""
如果不是deviceId:
raise VALUERROR('必须设置设备id')
user=self.model(deviceId=deviceId,**额外字段)
user.password=生成密码(password)
user.save()
返回用户
def create_超级用户(自我、设备ID、密码、**额外_字段):
"""
使用给定的电子邮件和密码创建并保存超级用户。
"""
额外字段。setdefault('is_staff',True)
extra_fields.setdefault('is_superuser',True)
额外字段。setdefault('is_active',True)
如果extra_fields.get('is_staff')不正确:
raise VALUERROR('超级用户必须具有is\u staff=True')
如果extra_fields.get('is_superuser')不为True:
raise VALUE ERROR('超级用户必须具有is\U Superuser=True')
返回self.create_user(设备ID、密码、**额外_字段)
注意:也不要为密码设置
max_length=255
。无论提供多长时间的密码,都只需要128个字符 由于散列而存储在数据库中。所以,你应该设置 密码字段上的最大长度=128


我非常怀疑您的自定义用户模型是否能够针对“django.contrib.auth.backends.modelbend”进行身份验证,因为此后端是专门为内置django用户模型创建的。您可能需要自定义身份验证后端。:)user.set_密码(password)有帮助吗?