Django - 从用户模型中删除用户名

6
为了在Django 1.5.x中创建一个新的用户模型,有两种方法:
  1. 继承AbstractUser类,这是您获得的默认用户模型,您可以使用它来扩展任何属性。但是,如果您想要删除任何字段,则从技术上讲虽然可行,但不建议;即使可以做到,我认为这违反了OOP原则。因此,如果您想要更改当前用户模型,则有第二种方法。
  2. 继承AbstractBaseUser,通过查看代码提供非常基本的功能。除非您从默认的Django用户模型中复制它们,否则您将错过所有权限、配置文件检索和绝对URL构造的好处。
上面是我对这种情况的理解。如果我的理解有误,请纠正我,但这难道不意味着,如果我想从模型中简单地删除username字段,因为我根本不需要它,我必须复制粘贴框架提供的模型代码,并继承AbstractBaseUserPermissionsMixin吗?对于这么简单的事情,这种方法看起来并不美观,而且看起来有些奇怪,因为我非常确定自定义用户模型主要是因为将email字段作为用户标识符的流行用例而引入的,而不是username。请您发表您的想法(和更正)。

在DJango中不建议这样做。您不应该从继承模型中删除父Django模型的字段。https://dev59.com/w3RB5IYBdhLWcg3weHLx - Srinivas Reddy Thatiparthy
1
@SrinivasReddyThatiparthy,我在帖子中已经指出了这一点。 - Aziz Alfoudari
1
为什么不在你的子类中覆盖用户名类属性?它甚至可以返回instance.email。 - jpic
2个回答

5
如果你查看django.contrib.auth.models文件的源代码,你会发现AbstractUser类的定义非常简短,并且以以下方式开始:
class AbstractUser(AbstractBaseUser, PermissionsMixin):
    ...

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

5
从可重用性的角度来看,使用“电子邮件”作为主用户字段非常普遍,为了做到这一点,你需要做你提到的那样,这对于一个常见的问题而言有些冗长。更好的想法可能是进一步概括“AbstractUser”,并允许它的子类在“用户名”或“电子邮件”之间选择主要字段。 - Aziz Alfoudari

-13

与使用mixin和其他解决方案不同, 解决不想要用户名的问题的最佳方法是用用户输入的电子邮件地址替换用户名。

您需要做的是, 进入通常位于Python路径中的Django源代码。 通常在Python文件夹的site-packages中,

进入Django文件夹,然后进入contrib文件夹,打开包含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

我没有足够的声望来发布代码的图像,如果有人想要屏幕截图,告诉我一声。

就这样!

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

最后一步: 转到使用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')

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


3
这种解决方案在很多方面都非常糟糕。我知道这篇文章已经相当老了,但我想警告其他人不要尝试这样做。编辑Django源代码或任何其他供应商库(位于您自己的代码库之外,例如virtualenv)永远不是正确的方法。只需记住它,甚至不要试图争论。只需查看上面链接的文章以找到更好的解决方案。 - aherok
OOoooof,这根本不接近任何建议的方法论。 永远不要像这样更改源代码。 - Ashutosh Kumar
请勿在Django源代码中进行自定义,这是不好的做法。请在其他评论中点赞,最好删除此回答。 - Farley

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