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

问题描述 投票:0回答:3

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

例如,如果用户使用“[email protected]”注册,他的用户名将为“some-user”,而如果另一个用户使用“[email protected]”注册” 那么他的用户名将是“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
python django django-models django-forms django-allauth
3个回答
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

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

然后我将用户名限制为电子邮件的前 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

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


7
投票

profiles.models.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

设置.py

SOCIALACCOUNT_ADAPTER = "profiles.models.CustomSocialAccountAdapter"

0
投票

ACCOUNT_AUTHENTICATION_METHOD(默认:

"username"
,可选:
"email"
"username_email"
) 指定要使用的登录方法 - 用户是否通过输入用户名、电子邮件地址或两者之一进行登录。将其设置为
"email"
需要
ACCOUNT_EMAIL_REQUIRED=True

完整配置在这里

© www.soinside.com 2019 - 2024. All rights reserved.