django-allauth задава потребителско име същото като имейл

Имам формуляр за регистрация, който изисква само имейл и парола. Когато потребител се регистрира, django-allauth създава потребителско име за този потребител, като премахва наставката "@email" от имейл адреса на потребителя.

Така например, ако потребител се регистрира с „[email protected]“, неговото потребителско име ще бъде „some-user“ и ако друг потребител се регистрира с „[email protected]“, тогава неговото потребителско име ще бъде „some-userr

Но това, което искам, е потребителското име и имейлът на потребителите да имат еднаква стойност.

И така, как мога да конфигурирам django-allauth да зададе потребителските имена като имейли на потребителите, без да ивици техните суфикси?

И ако е възможно, как мога да направя това, без да създавам персонализиран потребител.

В моите настройки.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

person GregC    schedule 07.12.2014    source източник
comment
Защо трябва потребителското име да е същото като имейла. Все пак можете да разрешите на вашия потребител да се регистрира с имейл адреса.   -  person Sudip Kafle    schedule 08.12.2014


Отговори (2)


Правя точно това, което искате да направите със сигнал на User 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

Надявам се това решение да ви помогне!

person ferrangb    schedule 13.12.2014
comment
Благодаря ти! Страхотен отговор! Точно това искам. Съжалявам, че не мога да гласувам за вас. Все още нямам достатъчно репутация. Като имам ще гласувам. - person GregC; 13.12.2014
comment
Радвам се да чуя, че е помогнало! :) - person ferrangb; 14.12.2014

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"
person Min ho Kim    schedule 17.03.2020