Django Can';t在自定义多用户中创建超级用户
我试图为3类用户实现注册:家长、学校和供应商Django Can';t在自定义多用户中创建超级用户,django,django-custom-user,superuser,Django,Django Custom User,Superuser,我试图为3类用户实现注册:家长、学校和供应商 from django.db import models from django.contrib.auth.models import (AbstractBaseUser, BaseUserManager) class UserManager(BaseUserManager): def create_user(self, email, password=None, is_staff=False, is_admin=False, is_act
from django.db import models
from django.contrib.auth.models import (AbstractBaseUser, BaseUserManager)
class UserManager(BaseUserManager):
def create_user(self, email, password=None, 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 parent:
raise ValueError("Users must have a role")
if not school:
raise ValueError("Users must have a role")
if not 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, parent, school, vendor, email, password=None):
user = self.create_user(
email,
parent,
school,
vendor,
password=password,
is_parent=True
)
return user
def create_schooluser(self, email, parent, school, vendor, password=None):
user = self.create_user(
email,
parent,
school,
vendor,
password=password,
is_school=True
)
return user
def create_vendoruser(self, email, parent, school, vendor, password=None):
user = self.create_user(
email,
parent,
school,
vendor,
password=password,
is_vendor=True
)
return user
def create_staffuser(self, parent, school, vendor, email, password=None):
user = self.create_user(
email,
parent,
school,
vendor,
password=password,
is_staff=True
)
return user
def create_superuser(self, email, parent, school, vendor, password=None):
user = self.create_user(
email,
parent,
school,
vendor,
password=password,
is_staff=True,
is_admin=True,
)
user.set_password(password)
return user
class User(AbstractBaseUser):
email = models.EmailField(max_length=255, unique=True)
active = models.BooleanField(default=True) # can login
parent = models.BooleanField(default=False) # parent user
school = models.BooleanField(default=False) # school admin user
vendor = models.BooleanField(default=False) # vendor user
staff = models.BooleanField(default=False) # staff user non superuser
admin = models.BooleanField(default=False) # superuser
timestamp = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'email' # username
REQUIRED_FIELDS = ['parent', 'school', 'vendor' ]
objects = UserManager()
def __str__(self):
return self.email
def get_full_name(self):
return self.email
def get_short_name(self):
return self.email
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
@property
def is_parent(self):
return self.parent
@property
def is_school(self):
return self.school
@property
def is_vendor(self):
return self.vendor
@property
def is_active(self):
return self.active
@property
def is_staff(self):
return self.staff
@property
def is_admin(self):
return self.admin
我遵循了教程的逻辑,不理解其中的一些部分。也许你可以建议一个更好的方法。但是,它可以工作,我可以通过选中复选框创建3个用户。但我不能创建超级用户。系统要求我输入“电子邮件”、“家长”、“学校”、“供应商”和密码,因为我有3个必填字段。最后出现错误消息:
文件“/home/azamat/dev/dj_test/src/accounts/models.py”,第79行,在create_superuser中
user=self.create\u用户(
TypeError:create_user()为参数“password”获取了多个值
那么如何创建超级用户以访问管理仪表板?您的create\u user()
已将密码定义为其第二个参数,因此当您调用self.create\u user(电子邮件、家长、密码=密码)时
,基本上要在那里传递两次密码,一次作为位置参数,第二次作为命名参数
将所有内容作为命名参数(例如,
password=password
)或位置参数传递。这里我们使用extra_字段
传递更多参数。您的参数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, email,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, email,password, **extra_fields):
user = self.create_user(
email = email,
password=password,
)
extra_fields.setdefault('is_school', True)
extra_fields.setdefault('is_parent', False)
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_staff') is not True:
raise ValueError('Users must have a role')
user.save(using=self._db)
return user
def create_vendoruser(self, email,password, **extra_fields):
user = self.create_user(
email = email,
password=password,
)
extra_fields.setdefault('is_school', False)
extra_fields.setdefault('is_parent', False)
extra_fields.setdefault('is_vendor', True)
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
extra_fields.setdefault('is_active', 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, email,password, **extra_fields):
user = self.create_user(
email = email,
password=password,
)
extra_fields.setdefault('is_school', False)
extra_fields.setdefault('is_parent', False)
extra_fields.setdefault('is_vendor', False)
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', False)
extra_fields.setdefault('is_active', 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, email,password, **extra_fields):
user = self.create_user(
email = email,
password=password,
)
extra_fields.setdefault('is_school', True)
extra_fields.setdefault('is_parent', True)
extra_fields.setdefault('is_vendor', True)
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.')
user.is_admin = True
user.is_superuser = True
user.save(using=self._db)
return user
在create\u superuser()
函数定义中删除set\u password()
#之前的代码
def create_超级用户(自我、电子邮件、密码):
user=self.create\u用户(
电子邮件,
密码,
是真的吗,
_admin=True,
)
返回用户
#暗号
为了创建超级用户,您只需根据create\u user()
函数定义创建email
、password
、is\u staff
和is\u admin
当您在create\u superuser()
中的create\u user()
中通过is\u staff
和is\u admin
作为关键字参数时,您只需要email
和password
作为create\u superuser()
的参数
Like wise:increate\u user()
definition中定义了命名参数。因此,不必每次调用函数时都传递这些参数
调用create\u user()
时,根据用户角色只传递必需的参数。其他参数可以忽略
类用户管理器(BaseUserManager):
def create_user(自我、电子邮件、密码、is_staff=False、is_admin=False、is_active=True、is_parent=False、is_school=False、is_vendor=False):
如果不是电子邮件:
raise VALUE ERROR(“用户必须有电子邮件地址”)
如果不是密码:
raise VALUERROR(“用户必须有密码”)
如果不是家长,也不是学校,也不是供应商:
raise VALUERROR(“用户必须具有角色”)
用户_obj=self.model(
电子邮件=自我规范化电子邮件(电子邮件)
)
用户对象设置密码(密码)#更改用户密码
用户_obj.parent=是_parent
用户_obj.school=是_school
用户\u obj.vendor=是\u供应商
用户\u obj.active=处于\u活动状态
用户_obj.staff=是_staff
用户_obj.admin=是_admin
用户对象保存(使用=self.\u db)
返回用户对象
def create_parentuser(自我、电子邮件、密码=无):
user=self.create\u用户(
电子邮件,
密码,
is_parent=is_parent
)
返回用户
def create_学校用户(自我、电子邮件、密码=无):
user=self.create\u用户(
电子邮件,
密码,
学校是真的吗
)
返回用户
def create_供应商用户(自我、电子邮件、密码=无):
user=self.create\u用户(
电子邮件,
密码,
_vendor=真吗
)
返回用户
def create_staffuser(self、email、password=None、is_staff=True):
user=self.create\u用户(
电子邮件,
密码,
这是真的吗
)
返回用户
def create_超级用户(自我、电子邮件、密码):
user=self.create\u用户(
电子邮件,
密码,
是真的吗,
_admin=True,
_parent=True,
学校是真的吗,
_vendor=真吗
)
返回用户
copyposted您的解决方案并得到一个错误:文件“/home/azamat/dev/dj_test/src/accounts/models.py”,第15行,在create_user raise ValueError(“用户必须有一个角色”)ValueError:用户必须有一个角色extra_fields={}extra_fields['is_school']=True extra_fields['is_parent']=True extra_fields['is_vendor']['is_staff']=True extra_fields['is_superuser']=True extra_fields['is_active']=True User.objects.create_User(电子邮件=)test@test.com“,password='top\u secret',**extra\u fields)
很抱歉,我不清楚该怎么办。我已将所有内容更改为命名参数user=self.create\u user(parent=parent,school=school,vendor=vendor,email=email,password=password),它给出了文件“/home/azamat/dev/dj_test/src/accounts/models.py”,第79行,在create_superuser=self.create_user(TypeError:create_user()中,如果我做user=self.create_user,会得到一个意外的关键字参数'parent'(家长、学校、供应商、电子邮件、密码)我收到文件“/home/azamat/dev/dj_test/src/accounts/models.py”,第11行,在create_user raise ValueError(“用户必须有电子邮件地址”)ValueError:用户必须有电子邮件address@AzamatUzbekov我可以用不同的词重复一遍,但我不知道还有什么别的办法可以让我明白