自定义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
相关产品推荐
相关产品推荐

