Django类视图LoginRequiredMixin登录校验未生效问题排查
代码错误说明
核心问题是你重写了get()方法,完全绕开了LoginRequiredMixin的登录校验流程:LoginRequiredMixin的权限判断逻辑内嵌在视图的dispatch()请求分发流程中,你自定义的get()方法没有触发任何父类的校验逻辑,直接返回渲染响应,所以所有用户无论登录状态都能访问页面。
除此之外代码还有3处编写错误:
redirect_field_name配置不符合预期:该参数的作用是指定「登录后回跳地址」对应的GET字段名,默认值为next,你填入的路由名mainpage:update是无效值,会导致登录后回跳逻辑异常。- 表单类属性名错误:
FormView识别表单类的固定属性名为form_class,你代码里写的form = UpdatePortfolio不会被框架识别,后续调用self.form_class会直接抛出属性不存在的错误。 - 冗余定义
get_object()方法:get_object()是DetailView/UpdateView这类操作单条模型数据的视图内置方法,你继承的FormView本身不涉及单模型实例查询,写这个方法没有任何作用。
修正后的代码
from django.shortcuts import render from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic import FormView from .forms import UpdatePortfolio from django.urls import reverse_lazy class UpdatePortfolioView(LoginRequiredMixin, FormView): login_url = reverse_lazy('users:login') redirect_field_name = 'next' form_class = UpdatePortfolio template_name = 'mainpage/updateportfolio.html' success_url = reverse_lazy('mainpage:update') # 无特殊需求不需要手动重写get方法,直接使用FormView内置逻辑即可自动走登录校验流程 # 若必须自定义get逻辑,需要先触发父类校验,参考写法: # def get(self, request, *args, **kwargs): # response = super().get(request, *args, **kwargs) # # 自定义逻辑写在这里 # return response
注意:
login_url和success_url如果用路由名配置,建议使用reverse_lazy做延迟解析,避免URLconf加载顺序导致的报错。
内容的提问来源于stack exchange,提问作者nicholas5538
相关产品推荐
相关产品推荐

