首页 > 解决方案 > 无法在自定义多用户中创建超级用户

问题描述

我试图为 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_user( TypeError: create_user() got multiple values for argument 'password'

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

标签: djangodjango-custom-usersuperuser

解决方案


create_user()已将密码定义为其第二个参数,因此当您调用时self.create_user(email, parent, password=password),您基本上是在此处两次传递密码,一次作为位置参数,第二次作为命名参数。

将所有内容作为命名参数(例如password=password)或位置参数传递。


推荐阅读