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前面,比如:
Django会按顺序匹配URL,访问# 错误顺序 path('<slug:course_slug>/<slug:lesson_slug>/', LessonDetailView.as_view(), name='lesson-detail'), path('accounts/login/', auth_views.LoginView.as_view(), name='login'),/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
相关产品推荐
相关产品推荐

