为了在Django 1.5.x中创建新的用户模型,有两种方法:
AbstractUser
类,这是您获得的默认用户模型,这样您就可以使用您想要的任何属性扩展它。但是,如果您想要删除任何字段,那么技术上可行但not recommended;我相信,即使可以做到,也违背了OOP原则。因此,如果您想要更改当前的用户模型,则有第二种方法。AbstractBaseUser
,looking at the code提供了非常基本的功能。你会遗漏权限,配置文件检索和绝对网址构建的所有优点,除非你从默认的Django用户模型中复制。以上是我对情况的理解。如果我错了,请纠正我,但这不意味着如果我想简单地删除模型中的username
字段,因为我根本不需要它,我必须复制粘贴模型代码在框架中提供并继承自AbstractBaseUser
和PermissionsMixin
?对于这么简单的事情,这种方法对我来说看起来并不是很漂亮,而且它看起来有点奇怪,因为我很确定自定义用户模型的引入主要是因为email
字段的流行用例用户标识符而不是username
。
请你的想法(和更正)。
答案 0 :(得分:6)
我在Django的谷歌集团中created a new discussion,结果非常冗长。
这最终转变为wiki page in Django以解决问题的不同方法解决问题。还有一个ticket刚刚开放。
答案 1 :(得分:5)
如果您查看django.contrib.auth.models
文件的源代码,那么您将看到AbstractUser
类的定义相当短,并且以这样的方式开始:
class AbstractUser(AbstractBaseUser, PermissionsMixin):
...
它继承自AbstractBaseUser
和PermissionMixin
。您可以定义自定义模型,并从提到的类继承它以获得权限支持。如果你想要所有其他模型字段,那么你需要复制它们,但它也是一个定制符合你需求的东西的机会。
答案 2 :(得分:-4)
而不是使用mixins和其他解决问题的应用程序, 解决不想要用户名问题的最佳方法是将用户名替换为用户输入的电子邮件地址。
你需要做的是, 转到通常位于python路径中的django源代码。 通常在python文件夹的site-packeges中,
转到django文件夹,进入contrib文件夹,进入auth文件夹,打开models.py文件,其中包含User模型的定义。
On Virtualenv -> <virtualenv_name>/lib/python2.7/site-packages/django
在auth app的models.py中
转到 - &gt; AbstractUser类 替换&#34;验证器中的正则表达式.RegexValidator&#34;有了这个:
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])?)+$"
只替换&#34; validators.RegexValidator&#34;
中的正则表达式部分在同一个班级中, 将用户名字段的max_length更改为254
我没有发布代码图片的声誉,如果有人想要在更改代码后看到它的样子截图,请给我打电话。
多数民众赞成!
现在返回到您的应用,然后您可以将用户名字段替换为此世界中任何类型的电子邮件。
最后一步: 转到您正在使用用户模型的应用程序,意味着
python manage.py syncdb
python manage.py makemigrations
python manage.py migrate
如果您没有看到auth模型迁移,那么
python manage.py migrate auth
现在你需要做的只是用电子邮件替换用户名,在注册过程中你可以做的有点像:
user = User.objects.create_user('email here', 'again email here', 'password here')
关于此问题的最佳部分是您无需更改身份验证后端,因为电子邮件本身就是用户名,您只需将用户名字段标记为电子邮件 即可。