Несколько полей для входа в Django пользователя

Можно ли при использовании Django-пользователя использовать несколько полей для входа? Как в Facebook, где мы можем войти, используя имя пользователя, адрес электронной почты, а также номер телефона.

1 ответ

Решение

Да, это! Вы можете написать свой собственный сервер аутентификации, как описано в этом разделе: https://docs.djangoproject.com/en/1.8/topics/auth/customizing/

Мы предполагаем, что вы создали учетную запись приложения / где вы расширяете модель пользователя для дополнительного поля телефона. Создайте свой аутентификационный backends.py внутри аккаунта / и напишите свою собственную логику аутентификации. Например:

from account.models import UserProfile
from django.db.models import Q


class AuthBackend(object):
    supports_object_permissions = True
    supports_anonymous_user = False
    supports_inactive_user = False


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


    def authenticate(self, username, password):
        try:
            user = UserProfile.objects.get(
                Q(username=username) | Q(email=username) | Q(phone=username)
            )
        except UserProfile.DoesNotExist:
            return None

        return user if user.check_password(password) else None

Поместите свой пользовательский бэкэнд в settings.py вашего проекта:

AUTHENTICATION_BACKENDS = ('account.backends.AuthBackend',)

Затем просто авторизуйтесь, передав имя пользователя, адрес электронной почты или телефон в поле имени пользователя POST.

from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)
            # Redirect to a success page.
        else:
            # Return a 'disabled account' error message
            ...
    else:
        # Return an 'invalid login' error message.
        ...

см.: https://docs.djangoproject.com/fr/1.8/topics/auth/default/

Другие вопросы по тегам