Авторизация пользователя при помощи email или логина?

Приветствую Тостер!!!
Есть задача нужно сделать авторизацию пользователя через email или логин(один field).
Это означает, что на странице авторизации есть два поля: Логин/Email и пароль.
Также нужно прописать соответствующие ошибки.
Моя реализация простой авторизации.
views.py
class RegisterFormView(FormView):
    form_class = UserCreationForm
    print form_class
    success_url = "/info/login/"
    template_name = "register.html"

    def form_valid(self, form):
        form.save()
        return super(RegisterFormView, self).form_valid(form)


class LoginFormView(FormView):
    form_class = AuthenticationForm
    template_name = "login.html"
    success_url = '/info/'

    def form_valid(self, form):
        self.user = form.get_user()
        login(self.request, self.user)
        return super(LoginFormView, self).form_valid(form)


class LogoutView(View):
    def get(self, request):
        logout(request)
        return HttpResponseRedirect("/info/")

urls.py
url(r'^login/$',views.LoginFormView.as_view(),name='login')
url(r'^logout/$', views.LogoutView.as_view(), name='logout')

шаблон
<!DOCTYPE html>
<html>
  <head>
    <title>Авторизация</title>
  </head>
  <body>
    <form action="{%url 'login' %}" method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <button type="submit">LOGIN</button>
    </form>
  </body>
</html>

Что нужно добавить/изменить!??!
  • Вопрос задан
  • 2442 просмотра
Решения вопроса 1
@deliro
Делал вот так авторизацию по логину (он же email) либо телефону. Сразу говорю, форму не использую, ибо всего два поля. В модели Person (связана с User OneToOneField'ом) есть поле phone.
class Login(TemplateView):
    template_name = 'core/home.html'

    def post(self, request, *args, **kwargs):
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        user = auth.authenticate(username=username, password=password)
        if user is None:
            try:
                possible_user = Person.objects.get(phone=username)
                user = auth.authenticate(username=possible_user.user.username, password=password)
            except Person.DoesNotExist:
                user = None
        if user is not None:
            if user.is_active:
                auth.login(request, user)
                return redirect(request.GET.get('next') or request.META.get('HTTP_REFERER') or reverse('home'))
            else:
                messages.add_message(request, messages.ERROR, 'Пользователь не активен')
        else:
            messages.add_message(request, messages.ERROR, 'Пользователь не найден')
        return redirect(reverse('home'))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы