2014-12-07 93 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

相關問題