Django - заставить пользователя сбросить исходный пароль - PullRequest
0 голосов
/ 02 ноября 2018

Я реализую функциональность, при которой пользователь вынужден сменить пароль (т. Е. Если администратор создает начальный пароль, пользователь должен изменить его при следующем входе в систему). Я использую пакет Django Contrib Auth.

Для этого я расширил профиль пользователя с помощью логического параметра force_password_change:

class Profile(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  force_password_change = models.BooleanField(default=True)

На мой взгляд, я расширяю стандарт LoginView:

class MyLoginView(LoginView):
  def form_valid(self, form):
      # form is valid (= correct password), now check if user requires to set own password
      if form.get_user().profile.force_password_change:
          return HttpResponseRedirect('password_change')
      else:
          auth_login(self.request, form.get_user())
          return HttpResponseRedirect(self.get_success_url())

Система выдает ошибку 404 страницы не найдена после нажатия кнопки login: The current path, accounts/login/, didn't match any of these.

Я заметил, что когда я добавляю auth_login(self.request, form.get_user()) непосредственно перед HttpResponseRedirect('password_change'), он работает нормально. Но это также означает, что пользователь (неправильно) аутентифицирован.

urls.py:

path('', myapp.MyLoginView.as_view(), name='login'),
path('password_change/', myapp.MyPasswordChangeView.as_view(), name='password_change'),

Почему это так и почему ошибка 404 ссылается на accounts/login/?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Используйте User.set_unusable_password , тогда предположим, что ваше представление смены пароля называется «change-password»:

Добавьте это к вашему логину:

from django.http import HttpResponseRedirect
from django.urls import revese

if not user.has_usable_password():
    return HttpResponseRedirect(reverse('change-password')
0 голосов
/ 03 ноября 2018

Вам необходимо использовать reverse для разрешения имени URL:

from django.urls import reverse

class MyLoginView(LoginView):
    def form_valid(self, form):
        # form is valid (= correct password), now check if user requires to set own password
        if form.get_user().profile.force_password_change:
            return HttpResponseRedirect(reverse('password_change'))
        else:
            auth_login(self.request, form.get_user())
            return HttpResponseRedirect(self.get_success_url())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...