×
   ❮   
PYTHON FOR DJANGO DJANGO FOR BEGINNERS DJANGO SPECIFICS PAYMENT INTEGRATION API BASICS Roadmap
     ❯   

CUSTOM USER MODEL

User manager

User Manager

The User Manager is a crucial part of Django's custom user model setup. It acts as the interface for handling the creation and management of user objects, including both regular users and superusers. Managers in Django allow us to encapsulate query logic and user creation methods in one place, ensuring consistency and maintainability across the project.

What is a Manager?

A manager in Django is an interface through which database query operations are provided to models. By default, Django gives every model a manager called objects, but for custom models, including custom user models, it’s common to define a custom manager to add or modify query methods and user creation logic.

Why Use a Custom User Manager?

When you create a custom user model in Django, you'll often need to customize how users are created. This includes handling fields like is_staff, is_superuser, password hashing, and ensuring email addresses are unique. A custom user manager allows you to define how regular users and superusers should be created with the appropriate permissions and field values.

Defining a Custom User Manager

To create a custom user manager, you’ll typically subclass BaseUserManager and implement methods to handle user creation. Here's an example of a custom user manager:


from django.contrib.auth.models import BaseUserManager

class CustomUserManager(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.')

        return self.create_user(email, password, **extra_fields)

Key Methods in the User Manager

1. create_user

This method is responsible for creating regular users. It takes an email, password, and any additional fields as input. Inside, it normalizes the email, hashes the password, and saves the user to the database.

  • Email Normalization: Ensures the email is in a standardized format.
  • Password Hashing: Uses Django’s set_password method to securely hash the password before saving it to the database.

2. create_superuser

The create_superuser method builds on create_user but sets the is_staff and is_superuser flags to True. This ensures that the user has administrative privileges. If these flags aren't set properly, it raises a ValueError to ensure that the superuser is created correctly.

Assigning the User Manager

Once your custom manager is created, you’ll need to assign it to your custom user model. This is done by adding the objects attribute to your model:


class CustomUser(AbstractBaseUser):
    email = models.EmailField(unique=True)
    # Additional fields...

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'

Best Practices

When defining a custom user manager, make sure to handle user creation logic carefully, particularly for superusers. Always verify that essential fields like is_staff and is_superuser are set appropriately.

Conclusion

The custom user manager is a powerful tool in Django, allowing you to encapsulate user creation logic and ensure that users and superusers are created with the correct attributes. Using a custom user manager ensures that your user model remains flexible and secure.


Django-tutorial.dev is dedicated to providing beginner-friendly tutorials on Django development. Examples are simplified to enhance readability and ease of learning. Tutorials, references, and examples are continuously reviewed to ensure accuracy, but we cannot guarantee complete correctness of all content. By using Django-tutorial.dev, you agree to have read and accepted our terms of use , cookie policy and privacy policy.

© 2024 Nischal Lamichhane. All Rights Reserved.
Django-tutorial.dev is styled using Bootstrap 5.
And W3.CSS.