Django provides built-in authentication which is good for most of the cases, but you may have needs that are being served by the existing system. For Ex: You want 'email' for authentication purpose rather than Django's username field and you want an extra field called 'display_name' as a full name for the logged in User. To meet the above requirements, we need to customize Django's built-in user model or substitute a completely customized model. In this blog post, we'll learn how to customize Django's built-in User model. Its good idea to extend Django User Model rather than writing whole new user model and there are a lot of ways but one good way is to extend it from Django itself. We get all features and properties of Django User and our own custom features on top of it.

Add the following to your app that holds custom user model.

In models.py 

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    name = models.CharField(max_length=100, blank=True, null=True)

and specify your custom user model in settings.py

AUTH_USER_MODEL = ‘your_app.User'


If you want to use your custom user model in models.py, you can get that model with `settings.AUTH_USER_MODEL` or `get_user_model()` of Django's auth module.

   from django.conf import settings
   from django.contrib.auth import get_user_model

   class Book(models.Model):
        author = models.ForeignKey(settings.AUTH_USER_MODEL)

(OR)

   from django.contrib.auth import get_user_model

   User = get_user_model()

   class Book(models.Model):
        author = models.ForeignKey(User)

By overriding the Django's Abstract user model we can specify our own username field by overriding 'USERNAME_FIELD', By default Django User model uses 'username' field for authentication purpose, we can set 'email' as username field. Just keep the following line in your User model to make user authenticate with email rather than Django's default username field.

class User(AbstractUser):
    name = models.CharField(max_length=100, blank=True, null=True)

    USERNAME_FIELD = 'email'

 

Subscribe To our news letter

Subscribe to our news letter to receive latest blog posts into your inbox. Please fill your email address in the below form.
*We don't provide your email contact details to any third parties
Latest Comments
Related Articles
Dynamic Models in Django-Part1 (adding new fields to models from admin) Siva Chittamuru

Some times in the production level there may be a chance of adding new fields to our model.With the normal django models when we add ...

Continue Reading...
Django Testing Automated with Self Hosted Gitlab CI and Docker Jagadeesh V

It is a bit pricy if you want to host code for collaboration using bitbucket or github on your own VPS or On-Premisis servers. Gitlab ...

Continue Reading...
Kubernetes Installation on BareMetal(Fedora) Dinesh Deshmukh

Kubernetes manages containerized applications across multiple hosts. With years of experience in managing highly scalable products, google has released kubernetes an open source project which ...

Continue Reading...