我有一个自定义用户,使用AbstractUser只是为了给它添加时间戳和FK

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.conf import settings
from .managers import CustomUserManager

class SubUser(AbstractUser):
    if settings.DEBUG:
        parent_user_id = models.ForeignKey('self', on_delete=models.DO_NOTHING, null=True, blank=True)
    else:
        parent_user_id = models.ForeignKey('self', on_delete=models.RESTRICT, null=True, blank=True)

    # Timestamps
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    USERNAME_FIELD = "username"

    objects = CustomUserManager()

    def __str__(self):
        return self.username

我读到,为了很好地加密密码,我必须创建一个Manager:

from django.contrib.auth.base_user import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, username, password=None, **extra_fields):
        user = self.model(username=username, **extra_fields)
        print(username)
        print(password)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, password=None, **extra_fields):
        user = self.create_user(username, password, **extra_fields)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user

当我从shell 创建超级用户时: u = SubUser.objects.create_superuser(username='asd', password='asdasd')个 实例创建成功,密码被加密,我以该超级用户登录admin/即可工作 但如果我创建一个普通用户: u = SubUser.objects.create_user(username='qwe', password='qweqwe') 实例创建成功,密码已加密,但我在admin/中的登录不起作用

现在,我还读到,如果我使用自定义用户,我应该使用我的管理器,在我所做的shell 中:

user_manager = CustomUserManager()
new_user = user_manager.create_user(username='qwe', password='qweqwe')

并得到一个错误

user.save(using=self._db)
TypeError: 'NoneType' object is not callable

我做错什么了? 用户在数据库中的记录很好,我直接看了数据库 我用的是Django 5.0.1和Sqlite3

当我从shell 创建超级用户时: u = SubUser.objects.create_superuser(username='asd', password='asdasd')个 实例创建成功,密码被加密,我以该超级用户登录admin/即可工作 但如果我创建一个普通用户: u = SubUser.objects.create_user(username='qwe', password='qweqwe') 实例创建成功,密码已加密,但我在admin/中的登录不起作用

现在,我还读到,如果我使用自定义用户,我应该使用我的管理器,在我所做的shell 中:

user_manager = CustomUserManager()
new_user = user_manager.create_user(username='qwe', password='qweqwe')

并得到一个错误

user.save(using=self._db)
TypeError: 'NoneType' object is not callable

我做错了什么?应该正确创建用户,但他们没有正确创建 用户在数据库中的记录很好,我直接看了数据库 我用的是Django 5.0.1和Sqlite3

推荐答案

你应该直接和经理一起工作,这样就行了.您使用SubUser.objects的管理器,这样它就会将模型注入到管理器中.Not通过使用CustomUserManager():如果在模型外部构造这样的管理器,它不会调用.contribute_to_class(),从而将模型注入到管理器中.

此外,作为not名员工的用户不能登录到管理员是normal行为,因为您需要成为管理员.您需要将其设置为.is_staffTrue.因此,您可以通过以下方式创建一个将.is_staff设置为True的非管理员用户:

SubUser.objects.create_user(username='qwe', password='qweqwe', is_staff=True)

Python相关问答推荐

合并其中一个具有重叠范围的两个框架的最佳方法是什么?

Python中的锁定类和线程以实现dict移动

Django文件上传不起作用:文件未出现在媒体目录或数据库中

除了Python之外,可以替代bare?

使用Ubuntu、Python和Weasyprint的Docker文件-venv的问题

Pandas 除以一列中出现的每个值

如何使用scipy从频谱图中回归多个高斯峰?

如何在图片中找到这个化学测试条?OpenCV精明边缘检测不会绘制边界框

大Pandas 胚胎中产生组合

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

对某些列的总数进行民意调查,但不单独列出每列

如何获取numpy数组的特定索引值?

梯度下降:简化要素集的运行时间比原始要素集长

我如何根据前一个连续数字改变一串数字?

迭代嵌套字典的值

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

如何在Python中获取`Genericums`超级类型?

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

在单次扫描中创建列表

如何在Python Pandas中填充外部连接后的列中填充DDL值