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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:57:30