【问题标题】:django-allauth set username the same as emaildjango-allauth 将用户名设置为与电子邮件相同
【发布时间】:2015-02-05 13:26:43
【问题描述】:

我有一个注册表单,只要求输入电子邮件和密码。当用户注册时,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

【问题讨论】:

  • 为什么需要用户名与电子邮件相同。无论如何,您都可以允许您的用户使用该电子邮件地址进行注册。

标签: python django django-models django-forms django-allauth


【解决方案1】:

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

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

【讨论】:

  • 谢谢!很好的答案!这正是我想要的。对不起,我不能投票给你。我还没有足够的声望。当我有我会投票。
  • 很高兴听到它有帮助! :)
【解决方案2】:

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

settings.py

SOCIALACCOUNT_ADAPTER = "profiles.models.CustomSocialAccountAdapter"

【讨论】:

    猜你喜欢
    • 2013-05-14
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2018-09-16
    • 2016-07-02
    • 2014-11-09
    • 2014-11-20
    相关资源
    最近更新 更多