2

I've created a custom user model using AbstractBaseUser. When I try to create a super user using terminal via createsuperuser command.

I get

in create_superuser
    user.is_staff = True
AttributeError: can't set attribute

Below is my code for creating custom user model.

import uuid
from django.db import models
from django.contrib.auth.models import (
 AbstractBaseUser, AbstractUser, BaseUserManager
)


class AdminUserManager(BaseUserManager):
 def create_user(self, email_id, password=None, *args, **kwargs):
  if not email_id:
   raise ValueError('User must have an Email ID')

  user = self.model(email_id=email_id)
  user.set_password(password)
  user.save(using = self._db)

  return user

 def create_staffuser(self, email_id, password, *args, **kwargs):
  user = self.create_user(
   email_id, password=password
  )
  user.is_staff = True
  user.save(using = self._db)

  return user
 
 def create_superuser(self, email_id, password, *args, **kwargs):
  user = self.create_user(
   email_id, password=password
  )

  user.is_staff = True
  user.is_superuser = True

  user.save(using = self._db)

  return user


USER_ROLE = (
  ('pilot', 'pilot'),
  ('admin', 'admin')
)

class AdminUser(AbstractBaseUser):
  user_uid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
  profile_picture = models.ImageField(upload_to='user_profile_picture/', null=True, blank=True)
  user_role = models.CharField(max_length=10, choices=USER_ROLE)
  email_id = models.EmailField(verbose_name='Email ID', unique=True)
  first_name = models.CharField(max_length=100)
  last_name = models.CharField(max_length=100)
  phone_number = models.CharField(max_length=20)
  created_at = models.DateTimeField(auto_now_add=True)
  updated_at = models.DateTimeField(auto_now=True)
  is_verified = models.BooleanField(default=False)

  is_active = models.BooleanField(default=True)
  is_staff = models.BooleanField(default=False)
  is_superuser = models.BooleanField(default=False)

  USERNAME_FIELD = 'email_id'
  REQUIRED_FIELDS = ['first_name', 'last_name']

  def get_full_name(self):
   full_name = f'{self.first_name} {self.last_name}'
   return full_name
 
  def get_short_name(self):
   return self.first_name

  def __str__(self):
   return self.email_id
 
  @property
  def is_staff(self):
   return self.is_staff

  @property
  def is_superuser(self):
   return self.is_superuser

  objects = AdminUserManager()
Coder
  • 21
  • 1
  • 1
    `is_staff` and `is_superuser` are already model fields, so you don't need to define them as properties. When you have duplicate names, the properties take precedence and the fields can't be accessed, which is why you're getting the error. See the answer to [this question](https://stackoverflow.com/questions/1454727/do-properties-work-on-django-model-fields). – evergreen Apr 29 '22 at 11:57
  • 1
    Also, you import `AbstractUser` but don't use it. The difference to `AbstractBaseUser` is explained [here](https://stackoverflow.com/questions/21514354/difference-between-abstractuser-and-abstractbaseuser-in-django). I think it would be easier for you to have your `AdminUser` model inherits from `AbstractUser` instead of `AbstractBaseUser`, since you're redefining many fields and methods which are already available in `AbstractUser`. – scūriolus Apr 29 '22 at 12:46

0 Answers0