Unable to login into django-admin with superuser credentials Using a custom user model

50 Views Asked by At

i am using the custom user model my superuser get's created but i am unable to login into the django-admin using the superuser credentials

below is the code i wrote to create a custom_user model

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from project.exceptions import *
import uuid



class UserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError("The Email field must be set")
        
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', 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 = self.create_user(email=email, password=password, **extra_fields)
        user.save(using=self._db)
        return user

class User(AbstractBaseUser, PermissionsMixin):
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, unique=True, editable=False)
    email = models.EmailField(
        verbose_name="Email",
        max_length=255,
        unique=True,
    )
    name = models.CharField(max_length=200)
    mobile = models.CharField(max_length=10)
    is_active = models.BooleanField(default=True)
    is_deactivated = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)  # Added this field
    is_superuser = models.BooleanField(default=False)  # Added this field
    created_at = models.DateTimeField(auto_now_add=True)
    deleted_at = models.DateTimeField(null=True, blank=True)

    objects = UserManager()

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ['name', 'mobile']

    def __str__(self):
        return self.name
    
    def has_perm(self, perm, obj=None):
        return self.is_superuser  # Modify as needed

    def has_module_perms(self, app_label):
        return self.is_superuser  # Modify as needed

    class Meta:
        ordering = ['-created_at']
        db_table = 'users'

settings.py incudes setting i am using

AUTH_USER_MODEL = 'users.User'

AUTHENTICATION_BACKENDS = [
    'project.auth_backend.AllAuthBackend',
    
]

django admin panel screenshot

just need to get logged in to django-admin panel

1

There are 1 best solutions below

0
Rohit Pal On

I modified AllAuthBackend:

from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend
    
class AllAuthBackend(ModelBackend):
    def authenticate(self, request, **kwargs):
        UserModel = get_user_model()
        try:
            username = kwargs.get('username', None)
            if username : 
                user = UserModel.objects.get(email=username)
                if user.check_password(kwargs.get('password', None)):
                    return user
                
            mobile = kwargs.get('mobile', None)
            if mobile : 
                user = UserModel.objects.get(mobile=mobile)
                if user.check_password(kwargs.get('password', None)):
                    return user
                
            email = kwargs.get('email', None)
            if email : 
                user = UserModel.objects.get(email=email)
                if user.check_password(kwargs.get('password', None)):
                    return user
                
        except UserModel.DoesNotExist:
            return None
        return None