First add backend in the settings configuration:
AUTHENTICATION_BACKENDS = ( 'users.views.CustomBackend', )
Add the backend function in users > views.py:
#Achieve both username and email can log in class CustomBackend(ModelBackend): def authenticate(self, request, username=None, password=None, ** kwargs): try : user = UserProfile.objects.get(Q(username=username) | Q(email=username)) if user.check_password(password): return user except Exception as e: return None
The modified views.py content is:
from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login from django.contrib.auth.backends import ModelBackend from .models import UserProfile from django.db.models import Q # Create your views here. def user_login(request): if request.method == 'GET': return render(request, 'login.html', {}) if request.method == 'POST': user_name = request.POST.get('username', '') pass_word = request.POST.get( ' password ' , '' ) #successfully returns user, failure returns None user = authenticate(username=user_name, password= pass_word) if user is not None: login(request, user) #Direct login return redirect( ' home ' ) else : return render(request, ' login.html ' , { ' msg ' : ' The username or password is incorrect. ' }) #Achieve both username and email can log in class CustomBackend(ModelBackend): def authenticate(self, request, username=None, password=None, ** kwargs): try : user = UserProfile.objects.get(Q(username=username) | Q(email=username)) if user.check_password(password): return user except Exception as e: return None