You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Django PasswordResetConfirmView设置用户is_active状态不生效如何解决

问题根源

你自定义了视图子类,但URL配置中始终调用Django原生的auth_views下的对应视图,完全没有用到你自己写的自定义类,所以自定义逻辑不会触发。同时你的代码存在缩进错误,部分逻辑不属于类的方法,也会导致执行异常。


具体修复步骤

1. 修正自定义PasswordResetConfirmView逻辑

要实现点击有效重置链接自动激活用户的需求,建议在dispatch方法中处理:先执行原生逻辑完成token有效性校验,确认token合法后再修改用户is_active状态,避免无效请求误改用户数据。

from django.contrib.auth import views as auth_views
from django.contrib.auth import get_user_model

User = get_user_model()

class CustomPasswordResetConfirmView(auth_views.PasswordResetConfirmView):
    def dispatch(self, request, *args, **kwargs):
        # 执行原生逻辑,完成uid、token校验,同时会给self.user赋值对应用户
        response = super().dispatch(request, *args, **kwargs)
        # 仅token有效时修改用户状态
        if self.user and self.token_valid and not self.user.is_active:
            self.user.is_active = True
            self.user.save(update_fields=['is_active'])
        return response

2. 修正URL配置

将URL中原生的视图类替换为你自定义的类:

# 先从自己的views模块导入自定义类
from .views import CustomPasswordResetConfirmView, LoginUser

urlpatterns = [
    # 替换原生auth_views.PasswordResetConfirmView为自定义类
    path('reset/<uidb64>/<token>/', CustomPasswordResetConfirmView.as_view(
        template_name="main/password/password_reset_confirm.html"
    ), name='password_reset_confirm'),
    # LoginView的URL也做同样替换,不要继续用auth_views.LoginView
    path('login/', LoginUser.as_view(
        template_name="你的登录模板路径.html"
    ), name='login'),
]

3. 修正LoginUser类的缩进错误

Python对缩进敏感,你之前的代码中方法不属于类的成员,自然不会执行:

class LoginUser(auth_views.LoginView):
    def get(self, request, *args, **kwargs):
        print("get请求触发", request)
        return super().get(request, *args, **kwargs)

    def get_success_url(self):
        return resolve_url('accounts:login')

原理说明

Django类视图通过类名.as_view()生成可调用的视图函数,你用哪个类调用as_view(),就会执行哪个类的逻辑,之前一直用原生类调用该方法,自定义子类自然不会生效。

内容的提问来源于stack exchange,提问作者Jhnsbrst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 17:45:03