Django Email Login (instead of using username)

Adi Ramadhan
2 min readAug 26, 2023

by default, django use username to login. For some case, using email is better than username (most user remember email rather than username). Important: email need to be unique to support this login mechanism.

login with email

Step 1: Preparation, Create Django Project
create virtualenv: virtualenv venv
start virtualenv: venv/Scripts/activate
install Django in virtualenv: pip install django==4.2
Create Django: django-admin startproject myproject
Go to myproject folder: cd myproject

Step 2: Create Django Apps
Create apps: python manage.py startapp core

Step 3: Create User Models (core/models.py) extends AbstractUser

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

class User(AbstractUser):
email = models.EmailField(unique=True)

email field should be set as unique field

Step 4: Create Backend Authentication (core/backends.py)

Create new file core/backends.py

from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend

class EmailBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
UserModel = get_user_model()
try:
user = UserModel.objects.get(email=username)
except UserModel.DoesNotExist:
return None
else:
if user.check_password(password):
return user
return None

Step 5: Update myproject/settings.py

Add INSTALED_APPS, add AUTH_USER_MODEL and add AUTHENTICATION_BACKENDS


...
INSTALLED_APPS = [
...
'core', #updated
]
...
AUTH_USER_MODEL = 'core.User' #updated
AUTHENTICATION_BACKENDS = ['core.backends.EmailBackend'] #updated

Step 6: Register User Model in Admin Site

from django.contrib import admin
from .models import User

# Register your models here.
admin.site.register(User)

Step 7: Makemigration and Migrate
Make migrations: python manage.py makemigrations
Migrate: python manage.py migrate

Step 8: Create Superuser
Make migrations: python manage.py createsuperuser
Type username, email password and retype password

Step 9: Test
Run Server: python manage.py runserver
Testing: http://127.0.0.1:8000/admin

logged in with email

--

--