为了在 Django 1.5.x 中创建新的用户模型,有两种方法:
AbstractUser
类,这是您获得的默认用户模型,这样您就可以使用您想要的任何属性来扩展它。但是,如果您想删除任何字段,技术上是可行的,但不建议;我相信,即使可以做到,也是违反 OOP 原则的。所以如果你想改变当前的用户模型,有第二种方法。AbstractBaseUser
,通过查看代码提供了非常基本的功能。您将错过权限、配置文件检索和绝对 URL 构造的所有优点,除非 从默认的 Django 用户模型复制它。 以上是我对情况的理解。如果我错了,请纠正我,但这是否意味着如果我想简单地从模型中删除
username
字段,因为我根本不需要它,我必须复制粘贴中提供的模型代码框架并继承于AbstractBaseUser
和PermissionsMixin
?对于这样一个简单的事情,这种方法对我来说看起来不太漂亮,而且看起来有点奇怪,因为我很确定引入自定义用户模型很大程度上是因为 email
字段作为用户的流行用例标识符而不是 username
。
请提出您的想法(和更正)。
如果您查看
django.contrib.auth.models
文件的源代码,那么您会发现 AbstractUser
类的定义相当短,开头如下:
class AbstractUser(AbstractBaseUser, PermissionsMixin):
...
它继承自
AbstractBaseUser
和 PermissionMixin
。您可以定义自定义模型并从上述类继承它以获得权限支持。如果您想要所有其他模型字段,那么是的,您将需要复制它们,但这也是自定义内容以满足您的需求的机会。
我知道这个问题现在已经很老了,但是对于任何寻求快速答案的人来说,我可能已经找到了一个简单的技巧。由于我只想删除 username 列 并保留所有其他字段(并添加更多字段),因此首先我们需要选择唯一标识符来代替用户名进行身份验证,在大多数情况下,像我这样的只是电子邮件字段,现在我们要做的就是更新
User model
,例如:
class User(AbstractUser):
email = models.EmailField(unique=True)
# Please note that the 3 following fields are extra which you don't have to add in your case
phone_number = models.CharField(max_length=12, unique=True)
last_logout = models.DateTimeField(null=True, blank=True)
current_status = models.CharField(max_length=40)
# This is necessary for making email field the identifier used for authentication
USERNAME_FIELD = "email"
REQUIRED_FIELDS = []
# this is the hack for overriding username and thus isn't a column in the database
@property
def username(self):
return self.get_username()
# or maybe return self.get_full_name() or any other method
就像您实现了自定义用户模型并删除了用户名字段,保留了所有其他字段并添加了更多您选择的字段,而无需使用
AbstractBaseUser
和 PermissionsMixin
并重新开始。希望有帮助。
PS: 当然,不要忘记使用
AUTH_USER_MODEL
在 settings.py 文件中指向新的自定义用户模型,您可以在 here 阅读相关内容
而不是使用 mixin 和其他解决问题的应用程序, 解决不需要用户名问题的最佳方法是将用户名替换为用户输入的电子邮件地址。
你需要做的是, 转到 django 源代码,该源代码通常位于 python 路径中。 通常在 python 文件夹的 site-packeges 中,
进入 django 文件夹,进入 contrib 文件夹,进入 auth 文件夹,打开包含 User 模型定义的 models.py 文件。
On Virtualenv -> <virtualenv_name>/lib/python2.7/site-packages/django
在auth应用程序的models.py中
转到 -> AbstractUser 类 将“validators.RegexValidator”中的正则表达式替换为:
r"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$"
仅替换“validators.RegexValidator”中的正则表达式部分
在同一个类中,将用户名字段的 max_length 更改为 254
我没有发布代码图像的声誉,如果有人想要更改代码后的屏幕截图,请告诉我。
就是这样!
现在返回您的应用程序,然后您可以将用户名字段替换为这个世界上任何类型的电子邮件。
最后一步: 转到您正在使用用户模型的应用程序,即任何地方
python manage.py syncdb
python manage.py makemigrations
python manage.py migrate
如果您没有看到身份验证模型正在迁移,
python manage.py migrate auth
现在您需要做的就是将用户名替换为电子邮件,在注册过程中您可以执行以下操作:
user = User.objects.create_user('email here', 'again email here', 'password here')
最好的部分是您不必更改身份验证后端,因为电子邮件本身就是用户名,您可以将用户名字段标记为电子邮件。