UnboundLocalError赋值前引用的局部变量“context”

2024-09-28 21:00:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在保存几乎相同类型的表单时遇到了这个错误(在赋值之前引用了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\u 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%相同的工作正常,但这个给我一个错误,我被困在它:(


Tags: form表单类型returntitlerequestdef错误
3条回答

出现此错误的原因是,函数包含一个代码路径,在该路径中使用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)

谈论第二个代码块

唯一的地方

context

定义在第12行

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

这只在触发else:语句时运行,因此

return render(request, 'breedingRecApp/clutch_detail_add.html', context)

如果未触发else语句,则不会定义上下文 干杯

如果方法是POST,form.is_valid()返回False,或者form.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)

相关问题 更多 >