【问题标题】:UnboundLocalError local variable 'context' referenced before assignment分配前引用的 UnboundLocalError 局部变量“上下文”
【发布时间】:2020-03-17 15:22:48
【问题描述】:

我被这个错误困住了(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% 相同的表单代码,它工作正常,但这个代码给了我一个错误,我被困在它上面:(

【问题讨论】:

  • 如果方法是 POST,但 form.is_valid() 失败,或者 form.save() 引发异常,则永远不要设置 context 变量。

标签: python django django-forms django-views


【解决方案1】:

说说第二个代码块

唯一的地方

context

定义在第 12 行

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

只有当 else: 语句被触发时才会运行,所以当

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

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

【讨论】:

  • 谢谢!我现在重新放置上下文变量,错误已经消失,但我的数据没有保存在数据库中。对于其他工作正常的表单,我有相同的代码。
【解决方案2】:

如果方法是 POST 并且 form.is_valid() 返回 Falseform.save() 引发异常,则会引发此错误,因为您从未声明上下文变量。

您也可能不需要在您的 form.save() 调用中执行 try: except:,因为该表单在那时有效。

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)

【讨论】:

  • 很遗憾,您的表单无效。有一行 if form.is_valid() ,只有当它返回 True 时才会继续执行 form.save() ;如果您执行 print(form.errors) 会说明什么?
【解决方案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)

【讨论】:

  • @s4starb4boy:当然不是,因为表单无效。由于form.is_valid() 返回False,这意味着您输入的值不正确。
猜你喜欢
  • 1970-01-01
  • 2017-08-10
  • 2020-01-16
  • 2019-12-05
  • 2017-09-19
  • 2020-09-26
  • 2022-01-02
  • 2019-03-22
  • 2019-01-24
相关资源
最近更新 更多