Задать вопрос

Авторизация пользователя при помощи 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>

Что нужно добавить/изменить!??!
  • Вопрос задан
  • 2460 просмотров
Подписаться 2 Оценить 3 комментария
Решения вопроса 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'))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы