无法在“自定义多用户”中创建超级用户

问题描述

我试图对三种类型的用户进行注册:父母,学校和供应商。

@Transactional
public ValidatedOrderDTO saveConsistentOrder(Order order) {
    boolean consistentOrder = true;
    var orderInconsistencies = new HashSet<OrderInconsistency>();
    for (OrderValidationService validationService : orderValidationServices) {
        ValidationResult validationResult = validationService.validate(order);
        if (!validationResult.isValid()) {
            OrderInconsistency inconsistency = validationResult.getorderInconsistency();

            Optional<OrderInconsistency> orderInconsistencyOpt = orderInconsistenciesDAO.findById(inconsistency.getId());
            if (orderInconsistencyOpt.isEmpty()) {
                orderInconsistenciesDAO.save(inconsistency);
            } else {
                inconsistency = orderInconsistencyOpt.get();
            }

            orderInconsistencies.add(inconsistency);
            consistentOrder = false;
        }
    }
    order.setInconsistencies(orderInconsistencies);
    ordersDAO.save(order);
    return new ValidatedOrderDTO(consistentOrder,consistenciesDescription);
}

我遵循了教程逻辑,并且不理解其中的某些部分。可能您可以提出更好的方法。但是,它可以工作,我可以通过选中复选框来创建3个用户。但是我无法创建超级用户。系统要求我输入“电子邮件”,“父母”,“学校”,“供应商”和密码,因为我有3个必填字段。最后,出现错误消息

create_superuser中的文件“ /home/azamat/dev/dj_test/src/accounts/models.py”,第79行 用户= self.create_user( TypeError:create_user()为参数“密码”获得了多个值

那么如何创建超级用户来访问管理仪表板?

解决方法

您的@commands.command() async def info(ctx,*,role:discord.Role): print(ctx.guild.roles.index(role)) 将密码定义为其第二个参数,因此,在调用create_user()时,您基本上在那儿两次传递密码,一次是作为位置参数,第二次是命名参数。

将所有内容作为命名参数(例如self.create_user(email,parent,password=password))或作为位置参数进行传递。

,

这里我们使用extra_fields传递更多参数。您的参数password被定义为第二个位置,但您调用了其他位置。 我只需更改下面的代码即可。

请尝试以下操作:

from django.db import models
from django.contrib.auth.models import (AbstractBaseUser,BaseUserManager)

class UserManager(BaseUserManager):
    def create_user(self,email,password=None,**extra_fields):
        if not email:
            raise ValueError("Users must have an email address")
        if not password:
            raise ValueError("Users must have a password")
        if extra_fields.get('is_parent') is not True:
            raise ValueError("Users must have a role")
        if extra_fields.get('is_school') is not True:
            raise ValueError("Users must have a role")
        if extra_fields.get('is_vendor') is not True:
            raise ValueError("Users must have a role")

        user_obj = self.model(
            email = self.normalize_email(email)
        **extra_fields
        )
        user_obj.set_password(password) # change user password
        user_obj.save(using=self._db)
        return user_obj

    def create_parentuser(self,password,**extra_fields):
        user = self.create_user(
            email = email,password=password,)
        extra_fields.setdefault('is_school',False)
        extra_fields.setdefault('is_parent',True)
        extra_fields.setdefault('is_vendor',False)
        extra_fields.setdefault('is_staff',False)
        extra_fields.setdefault('is_superuser',False)
        extra_fields.setdefault('is_active',True)

        if extra_fields.get('is_parent') 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.')
        user.save(using=self._db)
        return user
    def create_schooluser(self,True)
        extra_fields.setdefault('is_parent',False)
        extra_fields.setdefault('is_vendor',True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Users must have a role')
        user.save(using=self._db)
        return user

    def create_vendoruser(self,True)
        extra_fields.setdefault('is_staff',True)

        if extra_fields.get('is_vendor') is not True:
            raise ValueError('Users must have a role')
        user.save(using=self._db)
        return user

    def create_staffuser(self,True)
        extra_fields.setdefault('is_superuser',True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Users must have a role')
        user.save(using=self._db)
        return user

    def create_superuser(self,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.')
        user.is_admin = True
        user.is_superuser = True
        user.save(using=self._db)
        return user
,

删除set_password()函数定义中的create_superuser()

# code before

    def create_superuser(self,password):
        user = self.create_user(
                email,is_staff=True,is_admin=True,)
        return user

# code after

要创建超级用户,只需按照email函数定义创建passwordis_staffis_admincreate_user()

当您在is_staff中的is_admin中将create_user()create_superuser()作为关键字参数传递时,您只需要emailpassword作为create_superuser()的参数。

同样,在create_user()定义中,已定义了命名参数。因此,不必在每次调用该函数时都传递它们。

在调用create_user()时,仅根据用户角色传递必需的参数。其他论点可以忽略。

class UserManager(BaseUserManager):
    def create_user(self,is_staff=False,is_admin=False,is_active=True,is_parent=False,is_school=False,is_vendor=False):
        if not email:
            raise ValueError("Users must have an email address")
        if not password:
            raise ValueError("Users must have a password")
        if not is_parent and not is_school and not is_vendor:
            raise ValueError("Users must have a role")

        user_obj = self.model(
            email = self.normalize_email(email)
        )
        user_obj.set_password(password) # change user password
        user_obj.parent = is_parent
        user_obj.school = is_school
        user_obj.vendor = is_vendor
        user_obj.active = is_active
        user_obj.staff = is_staff
        user_obj.admin = is_admin
        user_obj.save(using=self._db)
        return user_obj

    def create_parentuser(self,password=None):
        user = self.create_user(
                email,is_parent=is_parent
        )
        return user

    def create_schooluser(self,is_school=True
        )
        return user

    def create_vendoruser(self,is_vendor=True
        )
        return user

    def create_staffuser(self,is_staff=True):
        user = self.create_user(
                email,is_staff=True
        )
        return user

    def create_superuser(self,password ):
        user = self.create_user(
                email,is_parent=True,is_school=True,is_vendor=True
        )
        return user