А Вам логин нужен?
В Django по умолчанию аутентификация происходит по связке логин/пароль. Сейчас большинство сайтов уходит от использования логина, заменяя его email’ом. И того получается, что убирается одно поле, значение которого на разных сайтах у пользователя может быть разным.
Разработчики Django позаботились о нас и дали возможность использовать свой backend для аутентификации. Но остается вопрос с регистрацией, ведь поле логин (username) является обязательным к заполнению! Если бы поля логина и email’а были одинакового размера, то можно было б копировать email в поле логина. Я у себя сделал так: если email не длиннее 30 символов то я его копирую в поле логин, в противном же случае пишу время в unix-timestamp надеясь, что никому не повезет попасть в одно и тоже время. Хотя в будущем (без хотя) добавлю проверку на уникальность логина.
Итого:
валидация логина в форме регистрации:
def clean_username(self):
email = self.cleaned_data.get('email', None)
if email and len(email) > 31:
return email
return str(time.time())
backend авторизации:
from django.contrib.auth.models import User
from django.contrib.auth.backends import ModelBackend
class EmailBackend(ModelBackend):
def authenticate(self, username=None, password=None):
try:
user = User.objects.get(email=username)
if user.check_password(password):
return user
except User.DoesNotExist:
pass
return None