Я делаю это, добавляя другой сервер аутентификации, используя AUTHENTICATION_BACKENDS . Или вы можете написать свой собственный бэкэнд аутентификации, принимая либо адрес электронной почты, либо имя пользователя.
Вот простая версия бэкенда аутентификации электронной почты. Обратите внимание, что для этого требуется, чтобы адреса электронной почты были уникальными в вашей базе данных, а не складывался регистр.
class EmailAuthBackend(ModelBackend):
"""
Email Authentication Backend
Allows a user to sign in using an email/password pair rather than
a username/password pair.
"""
def authenticate(self, request, email=None, password=None, **kwargs):
""" Authenticate a user based on email address as the user name. """
try:
user = User.objects.get(email=email)
except User.DoesNotExist:
# Run the default password hasher once to reduce the timing
# difference between an existing and a nonexistent user (#20760).
User().set_password(password)
else:
if user.check_password(password) and self.user_can_authenticate(user):
return user