Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Can';t在自定义多用户中创建超级用户_Django_Django Custom User_Superuser - Fatal编程技术网

Django Can';t在自定义多用户中创建超级用户

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

我试图为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_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:in
create\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我可以用不同的词重复一遍,但我不知道还有什么别的办法可以让我明白