Принудительно изменить пароль при первом входе в систему (Django) - PullRequest
0 голосов
/ 02 июля 2019

Клиент требует, чтобы менеджеры могли добавлять пользователей в компанию (со случайным одноразовым паролем), где пользователь должен изменить свой пароль, прежде чем получить доступ к чему-либо.Я занимаюсь разработкой приложения на Django 2.2

. Я создал пользовательского пользователя, заменил имя пользователя на адрес электронной почты и добавил к нему флаг bool change_password.Моя форма / функция change_password работает правильно, а перенаправление - нет.

urls.py

path('change-password/', views.change_password, name='change-password'),

views.py

class Login(LoginView):
    def form_valid(self, form):
        # form is valid (= correct password), now check if user requires to set own password
        if form.get_user().change_password:
            return HttpResponseRedirect(reverse('change-password'))
        else:
            auth_login(self.request, form.get_user())
            return HttpResponseRedirect(self.get_success_url())


def change_password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(data=request.POST, user=request.user)

        if form.is_valid():
            form.save()
            request.user.change_password = False
            request.user.save()
            update_session_auth_hash(request, request.user)
            return redirect(reverse('user_view'))
        else:
            return redirect(reverse('change-password'))
    else:
        form = PasswordChangeForm(user=request.user)

        args = {'form': form}
        return render(request, 'users/change_password.html', args)

Ожидаемое поведение - перенаправление на change-password, если флаг change_password установлен в True, хотяприложение выполняет перенаправление на изменение пароля, после отправки выдается следующая ошибка:

NotImplementedError: Django не предоставляет представление БД для AnonymousUser.

Если я добавлю декоратор, @login_required toВ моей функции change_password эта ошибка исчезла, однако я перенаправлен обратно на страницу входа с URL: users / login /? next = / users / change-password /

1 Ответ

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

Проблема в том, что в form_valid методе, который вы вызываете form.get_user(), который аутентифицирует / получает пользователя и правильно проверяет change_password, но он не регистрирует пользователя, что означает, что пользователь, выполняющий запросы, являетсяпо-прежнему анонимно для системы.Таким образом, в то время как пользователь перенаправляется, он не проходит проверку подлинности, что означает, что request.user объекты имеют тип AnonymousUser, который не живет в базе данных, следовательно, Django не предоставляет представление БД для AnonymousUser ошибка.

И когда вы используете декоратор @login_required, пользователь перенаправляется на страницу входа, потому что он не вошел в систему, и декоратор требует, чтобы пользователь вошел в систему, чтобы увидеть представление, которое он декорирует..

URL, который вы видите users/login/?next=/users/change-password/, в основном работает как декоратор login_required и выполняет две функции: 1. перенаправляет анонимного пользователя на страницу входа (часть URL users/login)2. как только они успешно вошли в систему, перенаправьте их туда, откуда они пришли (?next=/users/change-password/)

Я предлагаю вам передать имя пользователя, который пытался войти в систему, но должен изменить свой пароль наchange_password вид и там есть форма, ожидающая пользователя, который запрашивает текущий пароль, новый и подтверждение нового пароляартиллерияЭто самый простой способ сделать то, что вы хотите, но вам нужно будет подтвердить, что текущий пароль пользователя снова верен.

Извините за вводящий в заблуждение первый ответ, я не правильно прочитал вопросв первый раз, надеюсь, это имеет больше смысла:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...