Django-allauth如何将用户名设置为与电子邮件相同?

12

我有一个注册表单,只要求填写邮箱和密码。当用户注册时,django-allauth将从用户的电子邮件地址中删除"@email"后缀,并为该用户创建一个用户名。

例如,如果一个用户使用“some-user@example.com”注册,那么他的用户名将会是"some-user",如果另一个用户使用“some-user@gmail.com”注册,那么他的用户名将会是“some-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

为什么需要用户名与电子邮件相同?您可以允许用户使用电子邮件地址进行注册。 - Sudip Kafle
2个回答

24

我在用户 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

我之所以用信号(signal)是因为我希望每次保存用户(User)时都更新用户名(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

我希望这个解决方案能对您有所帮助!


1
谢谢!非常好的回答!这正是我想要的。很抱歉我不能给你点赞,因为我还没有足够的声望。等我有了声望,我会投票的。 - GregC
很高兴听到它有所帮助! :) - ferrangb

7

个人资料.模型.py(自定义用户模型)

from allauth.socialaccount.adapter import DefaultSocialAccountAdapter

class CustomSocialAccountAdapter(DefaultSocialAccountAdapter):

    def populate_user(self, request, sociallogin, data):
        user = super().populate_user(request, sociallogin, data)
        user.username = user.email
        return user

settings.py

SOCIALACCOUNT_ADAPTER = "profiles.models.CustomSocialAccountAdapter"

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