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

Зачем вам нужно, чтобы имя пользователя совпало с адресом электронной почты. В любом случае вы можете позволить своему пользователю регистрироваться с адресом электронной почты. –

ответ

6

я делать то, что вы хотите сделать с сигналом на пользователь 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 

Я надеюсь, что это решение помогает вам!

+1

Спасибо! Отличный ответ! Это именно то, чего я хочу. Извините, что я не могу вас поддержать. У меня пока нет достаточной репутации. Когда я буду голосовать. – GregC

+0

Приятно слышать, что это помогло! :) – ferrangb

Смежные вопросы