2014-12-07 40 views
7

我有一个注册表格只用于电子邮件和密码要求。当用户注册时,django-allauth通过从用户的电子邮件地址剥离“@email”后缀为该用户创建一个用户名。Django的allauth设置的用户名相同的电子邮件

因此,举例来说,如果用户登录了“[email protected]”他的用户名会“一些用户”等,如果另一个用户注册与“一些用户@ 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 
+0

为什么你会需要的用户名是相同的电子邮件。无论如何,您可以允许您的用户使用电子邮件地址注册。 – 2014-12-08 03:22:10

回答

6

我做你想要与用户pre_save信号到底该怎么做。

设定都OK,所以如果你在某个地方添加以下代码例如像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个字符(用户名默认最大lenght为30个字符):

username = user_email[:30] 

你也可以改变用户名的最大lenght,但对我来说我者优先使用默认长度。

因为我做这个,它可能发生,有重复的用户名。为了避免将其限制在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

谢谢!很好的答案!这正是我想要的。对不起,我不能upvote你。我还没有足够的声望。当我有我会投票。 – GregC 2014-12-13 19:13:10

+0

很高兴听到它帮助! :) – ferrangb 2014-12-13 21:20:58

相关问题