首页 > 解决方案 > 如何在 django 自定义用户模型中使用电子邮件或用户名登录用户

问题描述

这是我当前的代码,任何人都可以添加所需的代码以允许用户使用电子邮件或用户名登录

后端.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

自定义用户模型

在此处输入图像描述

在此处输入图像描述

标签: pythondjangobackend

解决方案


您可以创建一个ModelBackend专注于检索匹配项的UserModel位置USERNAME_FIELD,或者与查找 [Django-doc]email匹配的字段。__iexact

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

推荐阅读