Использование электронной почты в качестве имени пользователя с Django - PullRequest
3 голосов
/ 25 января 2012

Я столкнулся со следующей ошибкой при попытке создать пользователя в django:

>>> email = 'verylongemail@verylongemail.com'
>>> user_object = User.objects.create_user(username=email, email=email, password='password')
Data truncated for column 'username' at row 1

Кажется, в Django есть ограничение на число символов, разрешенных в имени пользователя.Как бы мне обойти это?

Ответы [ 3 ]

2 голосов
/ 25 января 2012

Если вы переопределите форму для пользователей Django, вы можете сделать это довольно изящно.

class CustomUserCreationForm(UserCreationForm):
"""
    The form that handles our custom user creation
    Currently this is only used by the admin, but it 

имеет смысл разрешить пользователям регистрироваться самостоятельно позже "" "email = forms.EmailField (обязательный = True) first_name = forms.CharField (обязательный = True) last_name = forms.CharField (обязательный = True)

class Meta:
    model = User
    fields = ('first_name','last_name','email')

, а затем в свой backends.py вы можете поместить

class EmailAsUsernameBackend(ModelBackend):
"""
Try to log the user in treating given username as email.
We do not want superusers here as well
"""

def authenticate(self, username, password):
    try:
        user = User.objects.get(email=username)
        if user.check_password(password):
            if user.is_superuser():
                pass
            else: return user

    except User.DoesNotExist: return None

тогда в вашем admin.py вы можете переопределить с помощью

class UserCreationForm(CustomUserCreationForm):
"""
    This overrides django's requirements on creating a user

    We only need email, first_name, last_name
    We're going to email the password
"""
def __init__(self, *args, **kwargs):
    super(UserCreationForm, self).__init__(*args, **kwargs)
    # let's require these fields
    self.fields['email'].required       = True
    self.fields['first_name'].required  = True
    self.fields['last_name'].required   = True
    # let's not require these since we're going to send a reset email to start their account
    self.fields['username'].required    = False
    self.fields['password1'].required   = False
    self.fields['password2'].required   = False

Mine имеет несколько других модификаций, но это должно привести вас на правильный путь.

2 голосов
/ 25 января 2012

Мне пришлось вручную изменить таблицу auth_user, чтобы сделать поле длиннее, а затем преобразовать электронные письма в имя пользователя, удалив символ @ и точку (возможно, и другие символы, на самом деле это не очень хорошее решение). Затем вам нужно написать собственный аутентификационный бэкэнд, который аутентифицирует пользователя на основе его электронной почты, а не имени пользователя, так как вам просто нужно сохранить имя пользователя, чтобы успокоить django.

Другими словами, больше не используйте поле имени пользователя для авторизации, используйте поле электронной почты и просто сохраните имя пользователя в качестве версии электронного письма, чтобы сделать Django счастливым.

Их официальный ответ на эту тему заключается в том, что многие сайты предпочитают имена пользователей для авторизации. Это действительно зависит от того, делаете ли вы социальный сайт или просто частный сайт для пользователей.

1 голос
/ 25 января 2012

Вы должны изменить поле длины имени пользователя так, чтобы syncdb создал правильную длину varchar, а также вы должны изменить AuthenticationForm, чтобы разрешить и большие значения, иначе ваши пользователи не будутвозможность войти.

from django.contrib.auth.forms import AuthenticationForm

AuthenticationForm.base_fields['username'].max_length = 150
AuthenticationForm.base_fields['username'].widget.attrs['maxlength'] = 150
AuthenticationForm.base_fields['username'].validators[0].limit_value = 150
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...