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

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}
    )

额外注意事项

  1. 你的Course模型定义中缺少start_time、end_time、max_delivery_date字段,需要补充到模型中才能正常保存这些数据;
  2. 使用form.save(commit=False)可以先获取修改后的实例,添加额外字段后再保存,比直接保存后再修改更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:47:52