А Вам логин нужен?

В 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