【问题标题】:Django - Removing username from user modelDjango - 从用户模型中删除用户名
【发布时间】:2013-09-17 03:53:46
【问题描述】:

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

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

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

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

【问题讨论】:

  • DJango 不建议这样做。不应从继承模型中的父 Django 模型中删除字段。stackoverflow.com/questions/611691/…
  • @SrinivasReddyThatiparthy 我已经在帖子中指出了这一点。
  • 为什么不直接覆盖子类中的用户名类属性呢?它甚至可以返回 instance.email。

标签: django django-users


【解决方案1】:

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

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    ...

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

【讨论】:

  • 我从可重用性的角度来看待它,使用email 作为主要用户字段是很常见的,为了做到这一点,你需要做你提到的事情,这在某种程度上是一个常见问题的长期解决方案。将AbstractUser 进一步概括并允许其子类在usernameemail 作为主要字段之间进行选择可能是一个更好的主意。
【解决方案2】:

而不是使用 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')

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

【讨论】:

  • 这在很多方面都是非常糟糕的解决方案。我知道这篇文章已经很老了,但我想警告其他人不要尝试这样做。编辑 Django 源代码或任何其他供应商库(位于您自己的代码库之外,例如 virtualenv)从来都不是正确的方法。记住它,甚至不要试图争论。看看上面的linked article就可以找到更好的解决方案。
  • OOoooof 甚至没有接近任何建议的方法。永远不要像这样更改源代码。
  • +1 在其他 cmets 上,永远不要自定义 Django 源代码。不好的做法。理想情况下请删除此答案
猜你喜欢
  • 2020-11-02
  • 2019-02-14
  • 2016-04-27
  • 2021-05-10
  • 2021-12-08
  • 2013-11-10
  • 2020-01-19
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多