5

为了在 Django 1.5.x 中创建新的用户模型,有两种方法:

  1. 继承AbstractUser类,这是您获得的默认用户模型,这样您就可以使用您想要的任何属性对其进行扩展。但是,如果您想删除任何字段,这在技术上是可行的,但不推荐;即使可以做到,我相信它也违反了 OOP 原则。所以如果你想改变当前的用户模型,还有第二种方法。
  2. Inherit AbstractBaseUser,通过查看代码提供了非常基本的功能。你会错过权限、配置文件检索和绝对 url 构造的所有优点,除非你从默认的 Django 用户模型中复制它。

以上是我对情况的理解。如果我错了,请纠正我,但这是否意味着如果我想简单地从username模型中删除该字段,因为我根本不需要它,我必须复制粘贴框架中提供的模型代码并继承自AbstractBaseUserPermissionsMixin? 对于这么简单的事情,这种方法对我来说看起来不是很漂亮,而且看起来有点奇怪,因为我很确定自定义用户模型的引入主要是因为email字段作为用户标识符而不是作为用户标识符的流行用例username.

请提出您的想法(和更正)。

4

2 回答 2

5

如果您查看该django.contrib.auth.models文件的源代码,您会发现AbstractUser该类的定义相当短,并且开头如下:

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    ...

它继承自AbstractBaseUserand PermissionMixin。您可以定义您的自定义模型并从上述类继承它以获得权限支持。如果您想要所有其他模型字段,那么是的,您将需要复制它们,但这也是一个自定义内容以满足您的需求的机会。

于 2013-09-12T18:10:24.177 回答
-11

与其使用 mixins 和其他解决问题的应用程序,解决不需要用户名问题的最佳方法是将用户名替换为用户输入的电子邮件地址。

您需要做的是,转到通常位于 python 路径中的 django 源代码。通常在 python 文件夹的站点包中,

进入 django 文件夹,进入 contrib 文件夹,进入 auth 文件夹,打开包含用户模型定义的 models.py 文件。

On Virtualenv -> <virtualenv_name>/lib/python2.7/site-packages/django

在 auth app 的 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

我没有发布代码图像的声誉,如果有人想要更改代码后的截图,请联系我。

而已!

现在回到你的应用程序,然后你可以用这个世界上任何类型的电子邮件替换用户名字段。

最后一步:转到您使用 User 模型的应用程序,即任何地方

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')

最好的部分是您不必更改身份验证后端,因为电子邮件本身就是用户名,您只需将用户名字段标记为电子邮件

于 2015-07-31T21:16:25.207 回答