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

Django出现local variable 'Facility' referenced before assignment报错求助

问题解决方法

报错根因

你导入的Facility是模型类名,但是在POST请求处理逻辑中,你把从表单获取的字段值也命名为了Facility,Python解释器会将Facility识别为当前视图函数的局部变量,执行到第一行facilities=Facility.objects.order_by('id')时,检测到后续代码对局部变量Facility有赋值操作,就会抛出“局部变量在赋值前被引用”的错误。

修复方案

修改POST逻辑中的局部变量名,避免和模型类名重名即可,比如改成小写开头的facility或者selected_facility,修改后的视图代码参考:

def addshift(request):
        facilities=Facility.objects.order_by('id')
        user=request.user   
        if request.method=="POST":
            StartTime=request.POST.get('StartTime')
            StartDate=request.POST.get('StartDate')
            EndTime=request.POST.get('EndTime')
            EndDate=request.POST.get('EndDate')
            # 修改变量名,避免和Facility类名冲突
            selected_facility = request.POST.get('Facility')
            Note=request.POST.get('Note')
            shift=Shift(user=request.user,StartTime=StartTime,StartDate=StartDate,EndTime=EndTime,EndDate=EndDate,Facility=selected_facility,Note=Note)
            shift.save()
            messages.success(request,"Shift added successfully!")
    
        context={
            'schedule':'active',
            'facilities':facilities,
            'user':user,
    
        }
        return render(request,'addshift.html',context)

额外注意事项

如果你的Shift模型中Facility是关联Facility表的外键字段,直接传递表单获取的字符串ID会报错,需要改成传递Facility实例,或者给外键字段名加_id后缀传值,示例:

# 方法1:传实例
facility_obj = Facility.objects.get(id=selected_facility)
shift=Shift(user=request.user,StartTime=StartTime,StartDate=StartDate,EndTime=EndTime,EndDate=EndDate,Facility=facility_obj,Note=Note)

# 方法2:传id给外键_id字段
shift=Shift(user=request.user,StartTime=StartTime,StartDate=StartDate,EndTime=EndTime,EndDate=EndDate,Facility_id=selected_facility,Note=Note)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:54:05