问题描述
@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
函数定义创建password
,is_staff
,is_admin
和create_user()
。
当您在is_staff
中的is_admin
中将create_user()
和create_superuser()
作为关键字参数传递时,您只需要email
和password
作为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