Есть ли способ войти в интерфейс администратора Django, используя имя пользователя или адрес электронной почты? - PullRequest
1 голос
/ 08 июля 2019

Я хочу внедрить систему входа в систему для входа в систему администратора Django по электронной почте или по имени пользователя.Кто-нибудь знает, как это реализовать.Я использую пользовательскую модель пользователя.Я знаю, как разрешить пользователю входить на сайт, используя имя пользователя или электронную почту.Но это не работает в интерфейсе администратора Django

from django.conf import settings
from django.contrib.auth import get_user_model


class EmailOrUsernameModelBackend(object):

    def authenticate(self, username=None, password=None):
        if '@' in username:
            kwargs = {'email': username}
        else:
            kwargs = {'username': username}
        try:
            user = get_user_model().objects.get(**kwargs)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, username):
        try:
            return get_user_model().objects.get(pk=username)
        except get_user_model().DoesNotExist:
            return None

1 Ответ

1 голос
/ 08 июля 2019

Вам необходимо передать запрос в методе authenticated:

from django.conf import settings
from django.contrib.auth import get_user_model


class EmailOrUsernameModelBackend(object):

    def authenticate(self, <b>request</b>, username=None, password=None):
        if '@' in username:
            kwargs = {'email__iexact': username}
        else:
            kwargs = {'username': username}
        try:
            user = get_user_model().objects.get(**kwargs)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, username):
        try:
            return get_user_model().objects.get(pk=username)
        except get_user_model().DoesNotExist:
            return None

Кроме того, обязательно укажите его в AUTHENTICATION_BACKENDS:

AUTHENTICATION_BACKENDS = ['path.to.EmailOrUsernameModelBackend']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...