Django中Course模型在视图中被识别为未定义局部变量的原因
解决UnboundLocalError: local variable 'Course' referenced before assignment问题
问题原因
你遇到的错误核心是函数内部局部变量名与导入的模型类名重名:
在ManageCourseView函数中,你首先导入了模型类Course,但在POST请求的处理逻辑里写了这行代码:
Course = form.save()
这行代码把原本指向模型类的Course名称,重新赋值给了form.save()返回的课程实例。根据Python的变量作用域规则:只要函数内部存在对某个变量的赋值操作,Python会将该变量视为整个函数内的局部变量。因此当函数开头执行course = Course.objects.get(id=id)时,Python认为Course是还未赋值的局部变量,直接抛出UnboundLocalError。
解决方案
把局部变量的名字改成与模型类不冲突的名称(比如updated_course),同时修正代码里的其他隐性问题:
修改后的完整视图代码
from django.views import generic from .models import Course from .forms import CourseForm from django.shortcuts import render, redirect from django.http import HttpResponseRedirect from datetime import datetime, timedelta # 补充缺失的导入 def ManageCourseView(request, id): course = Course.objects.get(id=id) if request.method == 'POST': form = CourseForm(request.POST, instance=course) if form.is_valid(): # 先获取修改后的实例,暂不保存到数据库 updated_course = form.save(commit=False) # 计算附加数据 start_date = datetime.strptime(form['start_date'].value(), '%d.%m.%Y') end_date = datetime.strptime(form['end_date'].value(), '%d.%m.%Y') max_delivery_date = end_date + timedelta(weeks=4) month = datetime.strftime(start_date, '%B') year = datetime.strftime(start_date, '%Y') if (end_date - start_date).days == 1: gvk_type = 'Wochenendkurs' gvk_type_id = 'WK' else: gvk_type = 'Abendkurs' gvk_type_id = 'AK' course_name = f'Geburtsvorbereitungskurs {month} {year} - {gvk_type}' if gvk_type_id == 'WK': start_time = datetime.strptime('09:30', '%H:%M') end_time = datetime.strptime('16:00', '%H:%M') else: start_time = datetime.strptime('18:30', '%H:%M') end_time = datetime.strptime('20:30', '%H:%M') # 修正时间格式的点为冒号 # 更新字段并保存 updated_course.name = course_name updated_course.start_time = start_time updated_course.end_time = end_time updated_course.price = 400 updated_course.max_delivery_date = max_delivery_date updated_course.save() # 重定向到更新后的课程详情页 return redirect('courses:detail', updated_course.id) else: form = CourseForm(instance=course) return render( request, 'courses/manage_course.html', {'form': form} )
额外注意事项
- 你的
Course模型定义中缺少start_time、end_time、max_delivery_date字段,需要补充到模型中才能正常保存这些数据; - 使用
form.save(commit=False)可以先获取修改后的实例,添加额外字段后再保存,比直接保存后再修改更高效。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

