How to create Custom User Model or Extend User Model in Django?

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 your own filed as username field. Just keep the following line in your User model to make user authenticate with your own field rather than Django's default username field. To use your own model field as USERNAME_FIELD make sure it is unique, or it will raise 'User.your_field' must be unique because it is named as the 'USERNAME_FIELD'.

class User(AbstractUser):
    myname = models.CharField(max_length=100, unique=True)

    USERNAME_FIELD = 'myname'

To Know more about our Django CRM(Customer Relationship Management) Open Source Package. Check Code

Posted On 21 December 2015 By MicroPyramid


Need any Help in your Project?Let's Talk

Latest Comments
Export html web page to pdf using jspdf

jsPDF is used to generate pdf files in client-side Javascript. You can find the links for jsPDF here and also you can find the link …

Continue Reading...
Django-REST Framework Object Level Permissions and User Level Permissions

Django-REST User Level Permissions and Object Level Permissions. User Level Permissions and Object level Permissions allow to serve customers based on their access levels or …

Continue Reading...
Django Unit Test cases with Forms and Views

By writing unit test cases, you can evaluate each code component in the initial stage itself and it'll improve your app/code performance. Which is the …

Continue Reading...

Subscribe To our news letter

Subscribe and Stay Updated about our Webinars, news and articles on Django, Python, Machine Learning, Amazon Web Services, DevOps, Salesforce, ReactJS, AngularJS, React Native.
* We don't provide your email contact details to any third parties