django-allauth задает имя пользователя, такое же, как электронная почта

У меня есть форма регистрации, которая запрашивает только адрес электронной почты и пароль. Когда пользователь регистрируется, django-allauth создает имя пользователя для этого пользователя, разделяя суффикс «@email» из адреса электронной почты пользователя.

Так, например, если пользователь регистрируется с помощью «[email protected]», его имя пользователя будет «some-user» и если другой пользователь зарегистрируется с помощью «[email protected]», его имя пользователя будет «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

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