Как зарегистрировать пользователя с помощью электронной почты или имени пользователя в пользовательской пользовательской модели django

Это мой текущий код, может ли кто-нибудь добавить необходимый код, чтобы позволить пользователю войти в систему с помощью электронной почты или имени пользователя

backends.py

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

class CaseInsensitiveModelBackend(ModelBackend):
    
    def authenticate(self, request, username=None, password=None, **kwargs):
        UserModel = get_user_model()
        if username is None:
            username = kwargs.get(UserModel.USERNAME_FIELD)
        
        try:
            case_insensitive_username_field = '{}__iexact'.format(UserModel.USERNAME_FIELD)
            user = UserModel._default_manager.get(**{case_insensitive_username_field: username})
        except UserModel.DoesNotExist:
            UserModel().set_password(password)

        else:
            if user.check_password(password) and self.user_can_authenticate(user):
                return user

Вы можете сделать ModelBackend, который будет сосредоточен на извлечении UserModel, где совпадает USERNAME_FIELD, или поле email совпадает с __iexact поиска [Django-doc].

from django.contrib.auth import get_user_model

def authenticate(self, request, username=None, password=None, **kwargs):
    UserModel = get_user_model()
    user_field = UserModel.USERNAME_FIELD
    if username is None:
        username = kwargs.get(UserModel.USERNAME_FIELD)
    
    try:
        case_insensitive_username_field = '{}__iexact'.format(UserModel.USERNAME_FIELD)
        user = UserModel._default_manager.get(
            Q((f'{user_field}__iexact', username)) | Q(username__iexact=username)
        )
    except UserModel.DoesNotExist:
        UserModel().set_password(password)

    else:
        if user.check_password(password) and self.user_can_authenticate(user):
            return user
Вернуться на верх