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

Django中“Local variable referenced before assignment”错误排查求助

解决Django中的"Local variable referenced before assignment"与AttributeError问题

先直接拆解核心问题和修复步骤:

1. 视图代码的直接错误

你的LessonDetailView里存在两个关键问题,直接引发了报错:

问题1:变量course未全局赋值

在get方法中,你仅在course_qs.exists()为True时才给course赋值,如果没有找到对应课程,course变量根本没被定义,后续执行lesson_qs = course.lesson.filter(...)时就会抛出local variable 'course' referenced before assignment错误。

问题2:模型属性拼写错误

你的Course模型定义了名为lessons的@property,但视图里写的是course.lesson.filter(少了一个s),哪怕course有值,这也会触发属性不存在的错误。

修复后的LessonDetailView代码

推荐用get_object_or_404简化查询逻辑,同时处理资源不存在的情况:

from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView, DetailView, View
from .models import Course, Lesson
from django.contrib.auth.mixins import LoginRequiredMixin

class CourseListView(ListView):
    model = Course

class CourseDetailView(DetailView):
    model = Course

class LessonDetailView(LoginRequiredMixin, View):
    def get(self, request, course_slug, lesson_slug, *args, **kwargs):
        # 直接获取课程,不存在则返回404
        course = get_object_or_404(Course, slug=course_slug)
        # 修正属性名为lessons,或用course.lesson_set.filter()
        lesson = get_object_or_404(course.lessons, slug=lesson_slug)
        
        context = {
            'object': lesson
        }
        return render(request, 'courses/lesson_detail.html', context)

2. 为什么访问登录页面会触发错误?

从回溯信息看,访问/accounts/login/时请求被路由到了LessonDetailView,这是URL配置顺序导致的:

  • 如果你的urls.py中,LessonDetailView的URL模式写在了登录URL前面,比如:
    # 错误顺序
    path('<slug:course_slug>/<slug:lesson_slug>/', LessonDetailView.as_view(), name='lesson-detail'),
    path('accounts/login/', auth_views.LoginView.as_view(), name='login'),
    
    Django会按顺序匹配URL,访问/accounts/login/时,会把accounts当作course_slug、login当作lesson_slug,从而进入LessonDetailView,因查询不到对应课程报错。

修复URL配置

把登录相关URL放在最前面,同时给课程URL加前缀避免冲突:

# 正确顺序
path('accounts/login/', auth_views.LoginView.as_view(), name='login'),
path('courses/<slug:course_slug>/<slug:lesson_slug>/', LessonDetailView.as_view(), name='lesson-detail'),

3. 额外提示

  • CSS/HTML不会引发这类Python变量或属性错误,可以排除前端代码的影响;
  • 用get_object_or_404比手动处理exists()+first()更简洁,还能自动返回404页面;
  • 如果你的登录页面URL不是默认的/accounts/login/,需要给LoginRequiredMixin显式指定login_url参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:42:41