user14497680
user14497680

Reputation:

TypeError: create_user() missing 3 required positional arguments(when createsuperuser)

I get this error when trying to create superuser:

TypeError: create_user() missing 3 required positional arguments: 'first_name', 'last_name', and 'role'

Is this the proper way to create it? I want to create superuser without username, just with email, and user can login only with their email addresses, and now when I create superuser it wants email, how I wanted, but gives me the error too.

class MyAccountManager(BaseUserManager):

def create_user(self, email, first_name, last_name, role, password, **extra_fields):
    if not email:
        raise ValueError("Users must have an email address")
    user = self.model(
        email = self.normalize_email(email),
        password = password,
    )
    user.save(using=self._db)
    return user

def create_superuser(self, email, first_name=None, last_name=None, role=None, password="", **extra_fields):
    user = self.create_user(
        email=self.normalize_email(email),
        password = password,
        first_name = first_name,
        last_name = last_name,
        role=role,
    )
    user.is_admin = True
    user.is_employee = True
    user.is_headofdepartment = True
    user.is_reception = True
    user.is_patient = True
    user.is_staff = True
    user.is_superuser = True
    user.save(using=self._db)
    return user

class CustomUser(AbstractUser):

    ADMIN = 1
    RECEPTION = 2
    HEADOFDEPARTMENT = 3
    EMPLOYEE = 4
    PATIENT = 5
    NOTACTIVE = 6

    ROLE_CHOICES = (
        (ADMIN, 'Admin'),
        (RECEPTION, 'Reception'),
        (HEADOFDEPARTMENT, 'HeadOfDepartment'),
        (EMPLOYEE, 'Employee'),
        (PATIENT, 'Patient'),
        (NOTACTIVE, 'NotActive'),
      )
    role                            = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, blank=True, default=True, null=True)
    email                           = models.EmailField(verbose_name="email", max_length=60, unique=True) 
    is_superuser                    = models.BooleanField(default=False)
    is_admin                        = models.BooleanField(default=False)
    is_employee                     = models.BooleanField(default=False)
    is_headofdepartment             = models.BooleanField(default=False)
    is_reception                    = models.BooleanField(default=False)
    is_patient                      = models.BooleanField(default=False)
    is_active                       = models.BooleanField(default=True)
    is_staff                        = models.BooleanField(default=False)

    objects = MyAccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email
    
    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True

I don't understand the error message. I create superuser from:

python3 manage.py createsuperuser

Upvotes: 0

Views: 1191

Answers (1)

Alvi15
Alvi15

Reputation: 335

def create_user(self, email, first_name, last_name, role, password=None, **extra_fields):

You created this, and when you want to create superuser, you called:

user = self.create_user(
            email=self.normalize_email(email),
            password=password
        )

But create_user needs email, first_name, last_name and role in its arguments. One way is to set their value to None/NULL (or "" if field is set to blank=True). However, please check if your model have any conflict when you set their value to None/NULL.

Upvotes: 1

Related Questions