【问题标题】:Django-allauth: PasswordChangeView override of success_url with logged out user results in errorDjango-allauth:PasswordChangeView 覆盖success_url,注销用户导致错误
【发布时间】:2020-05-25 18:07:20
【问题描述】:

通过 django-allauth 更改密码时,成功发布密码更改后的默认重定向再次是密码更改模板。因为我觉得这很混乱,所以我在我的 views.py 文件中覆盖了原来的 PasswordChnageView:

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/accounts/password/change/ 时,我收到以下错误消息:AttributeError at /accounts/password/change/ 'AnonymousUser' object has no attribute 'has_usable_password' 在我创建自定义覆盖之前,相同行为的结果是我被重定向到登录 url http://127.0.0.1:8000/accounts/login/?next=/

我需要对我的自定义视图进行哪些更改,以便在注销的用户尝试访问 url http://127.0.0.1:8000/accounts/password/change/ 时重定向到登录 url

【问题讨论】:

  • 您是否忘记在密码更改视图中添加权限?我不认为匿名用户可以更改密码。这应该会导致访问被拒绝错误。
  • IMO 这应该由原始的 django-allauth PasswordChangeView 处理,我唯一要覆盖的是success_url,所以不应该有任何其他变化
  • 来自 allauth 的 PasswordChangeView 本身没有登录所需的装饰器,它直接添加到 url 中:使用的视图是 password_change = login_required(PasswordChangeView.as_view())

标签: django django-views django-authentication django-allauth


【解决方案1】:

查看源代码:allauth 中的PasswordChangeView 本身并没有登录所需的装饰器,直接在url 中添加:使用的视图是password_change = login_required(PasswordChangeView.as_view())

有两种方式:

  1. login_required 装饰器添加到您的 URL。
from django.contrib.auth.decorators import login_required
        path('accounts/password/change/', login_required(MyPasswordChangeView.as_view()), name="account_change_password"),
  1. LoginRequiredMixin继承。
from django.contrib.auth.mixins import LoginRequiredMixin

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

确保 LoginRequiredMixin 位于您的子类的最左侧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2021-11-23
    • 2014-01-25
    相关资源
    最近更新 更多