赋值之前引用了UnboundLocalError局部变量'context'

时间:2019-11-21 16:13:40

标签: python django django-forms django-views

在保存几乎相同类型的其他表单时,我陷入了这个错误(在分配之前引用了UnboundLocalError局部变量'context'),但是工作正常,但是这个错误并没有显示错误

def clutchDetail(request):

clutchDetail = ClutchDetail.objects.all()
context = {'title': 'Clutch Detail',
           'active': 'active',
           'clutchDetail': clutchDetail,
           }
return render(request, 'breedingRecApp/clutch_detail.html', context)

def离合器Detail_add(请求):

if request.method == "POST":
    form = ClutchDetail_AddModelForm(request.POST or None)
    if form.is_valid():
        try:
            form.save()
            return redirect('breedingRecApp:clutch_detail')

        except:
            pass
else:
    form = ClutchDetail_AddModelForm()
    context = {'title': 'Species Detail Add',
               'active': 'active',
               'model': ClutchDetail,
               'form': form,
               }
return render(request, 'breedingRecApp/clutch_detail_add.html', context)

请帮助我解决此错误,我是Django的新手。我还有另一种形式的代码,它能100%正常工作,但是这给了我一个我遇到的错误:(

3 个答案:

答案 0 :(得分:0)

出现此错误的原因是因为函数包含一个在使用 context变量的代码路径,而没有先定义变量。例如,当您发出POST请求时,但是form.is_valid()检查失败。在这种情况下,代码流将调用render(..)函数,但是您没有定义context变量。

最小的解决方法可能是将context变量的定义 移到else语句之外:

def clutchDetail_add(request):
    if request.method == 'POST':
        form = ClutchDetail_AddModelForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('breedingRecApp:clutch_detail')
    else:
        form = ClutchDetail_AddModelForm()
    context = {
        'title': 'Species Detail Add',
        'active': 'active',
        'model': ClutchDetail,
        'form': form,
    }
    return render(request, 'breedingRecApp/clutch_detail_add.html', context)

答案 1 :(得分:0)

在方法是POST且form.is_valid()返回Falseform.save()引发异常的情况下,由于您从未声明上下文变量,因此会引发此错误。

您可能也不需要在try: except:通话中进行form.save(),因为此时表单是有效的。

def clutchDetail(request):

    clutchDetail = ClutchDetail.objects.all()
    context = {'title': 'Clutch Detail',
           'active': 'active',
           'clutchDetail': clutchDetail,
           }
    return render(request, 'breedingRecApp/clutch_detail.html', context)

def clutchDetail_add(request):

    if request.method == "POST":
        form = ClutchDetail_AddModelForm(request.POST or None)
        if form.is_valid():
            form.save()
            return redirect('breedingRecApp:clutch_detail')
    else:
        form = ClutchDetail_AddModelForm()

    context = {'title': 'Species Detail Add',
               'active': 'active',
               'model': ClutchDetail,
               'form': form,
    }
    return render(request, 'breedingRecApp/clutch_detail_add.html', context)

答案 2 :(得分:0)

谈论第二个代码块

唯一的地方

context

定义在第12行

context = {'title': 'Species Detail Add',

这仅在else:语句被触发时运行,所以在

时运行
return render(request, 'breedingRecApp/clutch_detail_add.html', context)
如果未触发else语句,则不会定义

context 干杯!