Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Can't set user.is_active and user.is_admin to True

I need to use email for authentication instead of user but when ever I create super user it doesn’t set the is_active and is_admin to True which are False by default!

models.py

class CustomUserManager(BaseUserManager):
    def create_user(self, email, username, password=None):
        if not email:
            raise ValueError('User must have an email')
        if not password:
            raise ValueError("User must have a password")
        user = self.model(
            email = self.normalize_email(email),
            username = username,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password=None):
        user = self.create_user(email, username, password)
        user.is_active = True
        user.is_staff = True
        user.is_admin = True
        user.is_superuser = True
        user.save(using=self._db)

        return user
    

class User(AbstractUser):
    email = models.EmailField(max_length=200,unique=True)
    username = models.CharField(max_length=200, unique=True)
    last_login = models.DateTimeField(auto_now=True)
    created_at = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    def __str__(self):
        return self.email

    objects = CustomUserManager

setting

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

AUTH_USER_MODEL = "account.User"

SQL table for users

id  ...   is_active is_staff    is_admin    is_superuser
1   ...       0        1           0            1
2   ...       0        1           0            1
3   ...       0        1           0            1
4   ...       0        1           0            1

>Solution :

You are still using the old manager (the _base_manager), you should set the new manager by creating a manager object:

class User(AbstractUser):
    # …

    objects = CustomUserManager()  # 🖘 use parenthesis

This will then also set User._default_manager to this CustomUserManager object, which is used by the createsuperuser command. Indeed, in the source code [GitHub], we see:

self.UserModel._default_manager.db_manager(database).create_superuser(
    **user_data
)
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading