Python Django Registration Redux:如何将唯一标识符从用户名更改为电子邮件,并使用电子邮件作为登录

Python Django Registration Redux:如何将唯一标识符从用户名更改为电子邮件,并使用电子邮件作为登录,python,django,django-registration,Python,Django,Django Registration,我正在我的项目中使用django注册redux进行用户注册。它使用默认的用户模型,该模型使用用户名作为唯一标识符 现在我们想放弃用户名,并使用电子邮件作为唯一标识符 我们还希望使用电子邮件而不是用户名登录 如何做到这一点 是否可以在不更改AUTH\u USER\u MODEL设置的情况下执行此操作 因为官方文件上说 如果要设置AUTH\u USER\u MODEL,则应在创建任何迁移或首次运行manage.pymigrate之前进行设置 实现这一点的最简单方法是自己制作 这就是一个例子 clas

我正在我的项目中使用
django注册redux
进行用户注册。它使用默认的
用户
模型,该模型使用
用户名
作为唯一标识符

现在我们想放弃
用户名
,并使用
电子邮件
作为唯一标识符

我们还希望使用
电子邮件
而不是
用户名
登录

如何做到这一点

是否可以在不更改
AUTH\u USER\u MODEL
设置的情况下执行此操作

因为官方文件上说

如果要设置
AUTH\u USER\u MODEL
,则应在创建任何迁移或首次运行
manage.py
migrate之前进行设置


实现这一点的最简单方法是自己制作

这就是一个例子

class MyUser(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    date_of_birth = models.DateField()
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'email' 

然后,需要在Django设置中设置用户模型

您将希望使用AbstractBaseUser。文件如下:


祝你好运

您可以像这样覆盖注册表

from registration.forms import RegistrationForm
class MyRegForm(RegistrationForm):
    username = forms.CharField(max_length=254, required=False, widget=forms.HiddenInput())

    def clean_email(self):
        email = self.cleaned_data['email']
        self.cleaned_data['username'] = email
        return email
然后将其添加到设置文件(详细信息请阅读此文件)

这将设置电子邮件到用户名字段,然后一切都将工作,因为电子邮件现在是用户名


唯一的问题是用户名字段的最大长度为30 DB。因此,超过30个字符的电子邮件将引发DB异常。要解决此问题,请覆盖用户模型(详细信息请阅读)。

官方文档说“如果您打算设置AUTH_user_模型,您应该在创建任何迁移或第一次运行manage.py migrate之前进行设置”,因此这将中断迁移谢谢您的回复。这实际上是一种黑客方式,但实际上是有效的。只需将用户名设置为与给定的电子邮件地址相同。其余的都和以前一样,不需要自定义用户模型。我遇到了一个与“Required=False”相关的错误,必须更正为“require=False”。解决办法奏效了。谢谢
REGISTRATION_FORM = 'app.forms.MyRegForm'