在Django 1.5中,我能否更改USERNAME_FIELD而不创建自定义用户?

10
我试图使用默认Django用户模型中的电子邮件字段作为用户名。我正在使用Django 1.5,我看到默认用户有一个USERNAME_FIELD属性。
在我的项目中,我想将以下USERNAME_FIELD = 'email'设置为用户模型中的默认值。
这个小但非常重要的调整是我想要改变用户模型中唯一的事情。我想知道是否有一种方法可以更改 USERNAME_FIELD 而无需子类化AbstractUser。我在这个问题中看到,您可以子类化AbstractUser并为其编写自定义管理器。
所以我想知道是否有更简单的方法来更改该属性?
如果没有,那么将扩展AbstractUser以使用电子邮件字段作为用户名的最少方式是什么?

请使用AbstractBaseUser。 - catherine
如果您子类化AbstractUser,您将遇到这些问题:https://dev59.com/rXLYa4cB1Zd3GeqPVDk7和https://dev59.com/qXLYa4cB1Zd3GeqPUzfM。 - Daviddd
2个回答

4
#Your app's __init__.py

from django.contrib.auth.models import User

User.USERNAME_FIELD = 'email'

7
这引发了一个错误:"django.core.management.base.CommandError: 一个或多个模型未能通过验证: auth.user: 在可交换的用户模型中,名为USERNAME_FIELD的字段不应该包含在REQUIRED_FIELDS中。 auth.user: USERNAME_FIELD必须是唯一的。请将unique=True添加到字段参数。" - Martey
1
我也遇到了同样的问题...我想知道在2013年3月至5月左右是否有任何破坏此功能的更改。我真的很希望这个能够正常工作... - user1496984

1
你需要通过扩展AbstractBaseUser而不是AbstractUser来编写新的自定义用户类。
在那里将你的电子邮件声明为USERNAME_FIELD。
可选地,你还可以声明一个自定义用户管理器,它继承自BaseUserManager以处理所需的用户名约束。你可以从该管理器的create_user函数中删除用户名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接