好的,对于每个使用Django且经常被新手询问的人来说,这个很明显,但是我想说清楚并讨论是否有其他方法可以做到这一点。现在最流行和最方便的方法是在用户名字段中存储电子邮件,因为Django 1.2允许使用“@”,“_”和“ - ”字符,但这种方式存在以下问题:
max_length=30
属性限制,这对于电子邮件来说非常小。即使您覆盖表单验证,除非您手动更改表格,否则数据库将包含varchar(30)
而不是EmailField
的{{1}}。varchar(75)
正常工作。我认为在使用User.email_user()
时还有其他一些地方。另一种方法可能是使用User.email
字段进行身份验证,方法是将其传递给您的身份验证后端,但仍然存在问题:
email
authenticate(self, email=None, password=None)
没有User.email
属性,这意味着您的数据库没有索引,使您的电子邮件查找速度变得很慢。unique=True
字段,该字段具有username
,方法是将其从表中完全删除或将其更改为允许NULL并删除索引。恢复,两种方式都是邪恶的,需要在syncdb之后执行特定于DB的代码,如果您需要独立于数据库的应用程序,这是不可接受的。
答案 0 :(得分:6)
我打包了django-email-as-username,如果您要删除用户名,并且只使用电子邮件,那么它几乎可以完成所需的一切。
简要概述是:
在引擎盖下,用户名是电子邮件的哈希版本,最终意味着我们不仅限于Django的用户名30字符限制(只是常规电子邮件75字符限制。)
编辑:从Django 1.5开始,您应该考虑使用自定义用户模型而不是'django-email-as-username'包。
答案 1 :(得分:5)
Logging In With Email Addresses in Django
如果表单上提供的登录名是电子邮件(包含“@”符号),它将尝试对其进行身份验证,如果不是电子邮件,则会返回用户名。 (当然,您只需要确保您的注册表格能够收集这项工作的电子邮件。)
答案 2 :(得分:0)
好吧,我没有必要在Django中使用电子邮件作为用户名,但我猜你可以创建一个UserProfile模型并将字段聚合到它,就像另一个电子邮件字段一样,并使其独一无二。因此,您可以使用user.get_profile()。email进行身份验证。
我想其他方法是继承User并重新定义字段,但我认为这仍然不是Django开发人员推荐的。
最后,您可以定义自己的自定义用户模型,然后返回django.contrib.auth.models.User以获取某些逻辑。
改变Django中用户表的代码:
from django.db import connection
cursor = connection.cursor()
cursor.execute("ALTER TABLE auth_user MODIFY COLUMN username varchar(75) NOT NULL")