django-allauth设置用户名与电子邮件相同


问题内容

我有一个注册表格,仅要求提供电子邮件和密码。当用户注册时,django-allauth通过从用户的电子邮件地址中删除“
@email”后缀来为该用户创建用户名。

因此,例如,如果某个用户使用“ **some-user@example.com ”注册,则其用户名将为“ some-user
”,而如果另一个用户使用“ **some-user@gmail.com
”进行注册,则其用户名将为“ 一些-userr

但是我想要的是用户名和用户电子邮件具有相同的值。

那么,如何配置django-allauth以将用户名设置为用户的电子邮件,而不会去除其后缀?

如果可能的话,如何在不创建自定义用户的情况下做到这一点。

在我的settings.py中:

#########################
# AllAuth Configuration #
#########################
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
ACCOUNT_PASSWORD_MIN_LENGTH = 8

问题答案:

我完全按照用户pre_save上的信号进行操作。

您的设置看起来不错,因此,如果您将以下代码添加到某个地方(例如core.models.py,它将在需要时运行):

@receiver(pre_save, sender=User)
def update_username_from_email(sender, instance, **kwargs):
    user_email = instance.email
    username = user_email[:30]
    n = 1
    while User.objects.exclude(pk=instance.pk).filter(username=username).exists():
        n += 1
        username = user_email[:(29 - len(str(n)))] + '-' + str(n)
    instance.username = username

我这样做的原因是我希望每次保存用户时都更新用户名。您可以仅在这种情况下检查电子邮件是否已更改,请更新用户名。

然后,我将用户名限制为电子邮件的前30个字符(用户名的默认最大长度为30个字符):

username = user_email[:30]

您也可以更改用户名的最大长度,但是在我的情况下,我更喜欢使用默认长度。

自从我这样做以来,可能会发生重复的用户名。为了避免重复的用户名,如果将生成的用户名限制为30个字符后已经存在,我在末尾放置-2,-3 …以使用户名唯一:

n = 1
while User.objects.exclude(pk=instance.pk).filter(username=username).exists():
    n += 1
    username = user_email[:(29 - len(str(n)))] + '-' + str(n)
instance.username = username

希望此解决方案对您有所帮助!