python - 如何在 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
自定义用户模型
解决方案
您可以创建一个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
推荐阅读
- python - 数值数据集的决策树叶节点条件
- html - 如何为表格中的每个单元格加边框?
- python - 循环槽元素(Selenium)时如何解决StaleElementReferenceException
- presto - 使用后备机制替代 presto
- xml - 如何使用 Powershell 从以下 XML 中获取受让人标签的值
- ubuntu - 更新到 4.0 后无法连接到珊瑚开发板:mdt shell 不起作用
- html - 是否有 Angular8 测试方法来查找嵌套组件实例?
- javascript - 用于反应的下拉菜单的 jss 样式
- python - 如何从存储在多个嵌套字典中的数据创建 Pandas 框架?
- modelica - 通过 OMShell 和 OMPython 调用/运行模型时出错 - OpenModelica