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

Gre*_*egC 8 python django django-models django-forms django-allauth

我有一个注册表单,只询问电子邮件和密码.当用户注册时,django-allauth通过从用户的电子邮件地址中删除"@email"后缀来为该用户创建用户名.

例如,如果用户使用" some-user@example.com "注册,则其用户名将为" some-user ",如果其他用户使用" some-user@gmail.com "注册,则其用户名将为" 一些用户 "

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

那么如何配置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
Run Code Online (Sandbox Code Playgroud)

fer*_*ngb 12

我完全按照用户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
Run Code Online (Sandbox Code Playgroud)

我用信号做的原因是我希望每次保存用户,用户名都会更新.您可以检查电子邮件是否已更改,仅在此情况下更新用户名.

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

username = user_email[:30]
Run Code Online (Sandbox Code Playgroud)

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

由于我这样做,可能会发生重复的用户名.为了避免重复的用户名,如果在将限制为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
Run Code Online (Sandbox Code Playgroud)

我希望这个解决方案能帮到你!


小智 7

profile.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
Run Code Online (Sandbox Code Playgroud)

设置.py

SOCIALACCOUNT_ADAPTER = "profiles.models.CustomSocialAccountAdapter"
Run Code Online (Sandbox Code Playgroud)