Django -allauth: переопределение PasswordChangeView для success_url при выходе пользователя из системы приводит к ошибке - PullRequest
0 голосов
/ 10 февраля 2020

При смене пароля с помощью django -allauth, перенаправление по умолчанию после успешной публикации смены пароля снова является шаблоном смены пароля. Поскольку я нахожу это непонятным, я переопределил исходный PasswordChnageView в моем файле views.py:

from allauth.account.views import PasswordChangeView
from django.urls import reverse_lazy

class MyPasswordChangeView(PasswordChangeView):
    success_url = reverse_lazy('home')

и изменил свой файл urls.py:

from django.urls import path, include
from users.views import MyPasswordChangeView 

urlpatterns = [
        ...
        # User management
        path('accounts/password/change/', MyPasswordChangeView.as_view(), name="account_change_password"),
        path('accounts/', include('allauth.urls')),
        ...
    ]

Это прекрасно работает, когда пользователь вошел в систему, однако, когда я пытаюсь получить доступ к URL http://127.0.0.1: 8000 / account / password / change / во время выхода из системы, я получаю следующее сообщение об ошибке: AttributeError at /accounts/password/change/ 'AnonymousUser' object has no attribute 'has_usable_password' До того, как я создал свой пользовательский переопределить, результатом того же поведения было то, что я был перенаправлен на URL входа в систему http://127.0.0.1: 8000 / account / login /? next = /

Что мне нужно изменить с мой пользовательский вид для перенаправления на URL входа в систему, когда вошедший в систему пользователь пытается получить доступ к URL http://127.0.0.1: 8000 / account / password / change /

1 Ответ

1 голос
/ 10 февраля 2020

Посмотрите на исходный код: PasswordChangeView от allauth не имеет декоратора, необходимого для входа в систему, он добавляется непосредственно в URL: используется представление password_change = login_required(PasswordChangeView.as_view()).

Существует 2 способа:

  1. Добавить login_required декоратор к вашему URL.
from django.contrib.auth.decorators import login_required
        path('accounts/password/change/', <b>login_required(MyPasswordChangeView.as_view())</b>, name="account_change_password"),
Наследовать от LoginRequiredMixin.
from django.contrib.auth.mixins import LoginRequiredMixin

class MyPasswordChangeView(<b>LoginRequiredMixin</b>, PasswordChangeView):
    success_url = reverse_lazy('home')

Убедитесь, что LoginRequiredMixin находится в самой левой части вашего дочернего класса.

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