2014-12-07 14 views
7

Sadece e-posta ve şifre soran bir Kayıt formum var. Bir kullanıcı kaydolduğunda, django-allauth, kullanıcının e-posta adresini "@email" sonek formunu çizerek bu kullanıcı için bir kullanıcı adı oluşturur.django-allauth kullanıcı adını e-posta ile aynı olarak ayarla

Yani, örneğin, bir kullanıcı oturum yukarı "[email protected]" Onun adı olacaksa "bazı kullanıcılı" ve "bazı kullanıcı ile başka bir kullanıcı oturum yukarı @ gmail.combazı-userr "sonra onun adı olacak" "

Ama ne istediğim aynı değere sahip kullanıcıların kullanıcı adı ve e-posta olduğunu.

Django-allauth'u, kullanıcı adlarını kullanıcı son eklerini çizmeden e-posta olarak ayarlamasını nasıl yapılandırabilirim?

Ve mümkünse, özel bir kullanıcı oluşturmadan bunu nasıl yapabilirim. Benim settings.py olarak

:

######################### 
# 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

Neden e-posta ile aynı olmak için kullanıcı adı gerekir. Kullanıcınızın yine de e-posta adresine kaydolmasına izin verebilirsiniz. –

cevap

6

Sana Kullanıcı pre_save bir sinyal ile yapmak istiyorum tam olarak ne yapmak. Her bunu istiyorum o

@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 

Ben bir sinyal ile bunu nedeni olduğunu:

Ayarlarınız yere aşağıdaki kodu eklerseniz böylece örneğin core.models.py için istediğiniz kadar çalışacak gibi Tamam bak Zaman Kullanıcı kaydedildi, kullanıcı adı güncellendi. E-postanın değişip değişmediğini kontrol edebilirsiniz, bu durumda sadece kullanıcı adını güncelleyiniz.

Sonra (kullanıcı adı varsayılan maksimum uzunluğu 30 karakter olan) e-postanın ilk 30 karakter adı sınırlamak:

username = user_email[:30] 

Ayrıca kullanıcı adının maksimum uzunluk değişebilir, ama benim durumumda ben tercih varsayılan uzunluğu kullanmak.

Bunu yaptığımdan beri, tekrarlanan kullanıcı adları olabilir.

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 

Bu çözümü umut: zaten var 30 karaktere sınırlayarak sonra kullanıcı adı çıkan durumda tekrarlanan adları önlemek için, ben -2, -3 ... sonunda benzersiz bir kullanıcı adı yapmak koymak sana yardım eder!

+1

Teşekkürler! Mükemmel cevap! Tam olarak istediğim bu. Kusura bakma, seni rahatsız edemem. Henüz yeterince itibarım yok. Ben sahip olduğumda oy kullanacağım. – GregC

+0

Yardım ettiğini duyduğuma sevindim! :) – ferrangb