You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django自定义User模型设USERNAME_FIELD为email仍用用户名登录是为何?

问题根本原因

问题出在你自定义的get_by_natural_key方法实现错误,和继承逻辑无关。
Django的认证流程中,调用get_by_natural_key时传入的参数值就是你在USERNAME_FIELD指定的字段的用户输入值,你现在把参数名写成了username,还直接按username字段查询,相当于强行忽略了USERNAME_FIELD的配置。

修复方案

把get_by_natural_key改成按email字段查询即可,参考代码:

def get_by_natural_key(self, email):
    return self.get(email__iexact=email)

提示:建议使用iexact做不区分大小写的匹配,避免用户输入大小写不一致导致登录失败,符合邮箱的常规使用逻辑。

原理解释

  • 你设置USERNAME_FIELD = "email"后,Django认证时会把用户在登录表单输入的账号值,作为参数传给get_by_natural_key
  • 你之前的实现不管传入的是什么值,都去username字段匹配,自然就变成了用用户名登录的效果

内容的提问来源于stack exchange,提问作者Papis Sahine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:45:00