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
相关产品推荐
相关产品推荐

