Django, a high-level Python web framework, provides a robust User model for authentication and user management. However, many projects require extending the default User model to accommodate additional user-specific attributes and behaviors. In this blog, we’ll explore the method of extending Django User Model using
AbstractBaseUser and walk through a detailed example.
AbstractBaseUser class is a powerful foundation for creating a custom User model in Django. Unlike
AbstractUser, which provides a more straightforward approach by extending the existing User model,
AbstractBaseUser allows you to create a user model from scratch while customizing authentication methods and fields.
Benefits of Using AbstractBaseUser
- Customization: With
AbstractBaseUser, you can implement authentication methods tailored to your application’s needs.
- Flexibility: You have complete control over fields, allowing you to create a User model that aligns with your project’s requirements.
- Scalability: As your project grows, you can easily add or modify fields and methods.
Let’s dive into the process of extending Django User Model using
AbstractBaseUser with an example of creating a
Note: We have create a already created our django project using using our blog on Django Basic Template Boilerplate Skeleton Project. For this example, we have created a app named “accounts“.
Step 1: Create a Custom User Manager
# accounts/models.py from django.contrib.auth.models import BaseUserManager class CustomUserManager(BaseUserManager): def create_user(self, email, username, password=None, **extra_fields): if not email: raise ValueError("Email must be set") email = self.normalize_email(email) user = self.model(email=email, username=username, **extra_fields) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, username, 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.") return self.create_user(email, username, password, **extra_fields)
Step 2: Create the Custom User Model
# accounts/models.py from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin from django.db import models class CustomUser(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True) username = models.CharField(max_length=30, unique=True) bio = models.TextField(max_length=500, blank=True) profile_picture = models.ImageField(upload_to='profile_pics/', blank=True) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) objects = CustomUserManager() USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username'] def __str__(self): return self.username
Step 3: Update Settings
In your project’s
settings.py, specify your custom User model:
AUTH_USER_MODEL = 'your_app.CustomUser'
Step 4: Applying Migrations
Run the following commands to apply migrations and create the custom User model:
python manage.py makemigrations python manage.py migrate
Extending the Django User Model using the
AbstractBaseUser method offers unparalleled customization and control over your application’s authentication and user management. By following the step-by-step example in this blog, you’ve learned how to create a
CustomUser model with unique fields and authentication logic. This approach empowers you to build applications that go beyond the default User model while maintaining security and scalability. As you explore Django’s capabilities further, remember that selecting the right extension method depends on the complexity and goals of your project.
Find this project on Github.