DEV Community

VivekAsCoder
VivekAsCoder

Posted on

5 2

Simple Custom User Model In Django :: CookBook

Custom User Model in Django.

Steps Involve.

  • Creating custom user model and manager.
  • Update the settings.py
  • Customize the UserCreationForm and UserChangeForm.
  • Finally update the admin.py file for custom user model.

Models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.utils.translation import gettext_lazy as _
from django.utils import timezone
from app.managers import CustomUserManager

class CustomUser(AbstractBaseUser, PermissionsMixin):
    phone_no = models.CharField(_("Phone Number"), unique=True, max_length=10)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)
    date_joined = models.DateTimeField(default=timezone.now)

    USERNAME_FIELD = 'phone_no'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

    def __str__(self):
        return self.phone_no
Enter fullscreen mode Exit fullscreen mode

Manager.py

from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import ugettext_lazy as _


class CustomUserManager(BaseUserManager):
    def create_user(self, phone_no, password, **extra_fields):
        if not phone_no:
            raise ValueError(_("The phone no. must be provided."))
        if len(phone_no) != 10:
            raise ValueError(_("The Phone No Should be 10 digits long."))
        user = self.model(phone_no=phone_no, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, phone_no, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', 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(phone_no, password, **extra_fields)

Enter fullscreen mode Exit fullscreen mode

Settings.py

AUTH_USER_MODEL = 'app.CustomUser'
Enter fullscreen mode Exit fullscreen mode

Forms.py

from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from app.models import CustomUser

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm):
        model = CustomUser
        fields = ('phone_no',)

class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = CustomUser
        fields = ('phone_no', )
Enter fullscreen mode Exit fullscreen mode

Admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

from .forms import CustomUserChangeForm, CustomUserCreationForm
from .models import CustomUser


class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = CustomUser
    list_display = ('phone_no', 'is_staff', 'is_active')
    list_filter = ('phone_no', 'is_staff', 'is_active')

    fieldsets = (
        (None, {'fields': ('phone_no', 'password')}),
        ('Permissions', {'fields': ('is_staff', 'is_active')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide', ),
            'fields': ('phone_no', 'password1', 'password2', 'is_staff', 'is_active')
        }),
    )
    search_fields = ('phone_no', )
    ordering = ('phone_no', )


admin.site.register(CustomUser, CustomUserAdmin)
Enter fullscreen mode Exit fullscreen mode

Quick Note:

I wanted to make user model as simple as possible so this is what i did, create a custom user model with basically only two fields phone_no and password.

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (2)

Collapse
 
gravesli profile image
gravesli

I think you are great! i just want to discuss tech with Python developer.
I built a display machine state using Python3 with Flask!
Flask State Github:github.com/yoobool/flask-state
Should i can get some improvement suggestions from you? Thanks~

Collapse
 
gravesli profile image
gravesli

Hi, thanks for your reply. Would you give me a star on GitHub? because my project isn't active. ^.^

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay