【问题标题】:Django UnboundLocalErrorDjango UnboundLocalError
【发布时间】:2012-03-25 18:46:14
【问题描述】:

我有一个简单的表单集,用于将捐赠者注册到我的数据库。

如果我在页面上找到来自 DB 的现有条目并从表单输入中删除一个值并提交,我会收到 UnboundLocalError。

Django Version: 1.3 
Exception Type: UnboundLocalError 
Exception Value: local variable 'dac' referenced before assignment 

views.py

@login_required
def dizimista(request, nr_dizimista):
    dizimista = get_object_or_404(CadastroDizimista, pk=nr_dizimista, usuario=request.user)
    if request.method == 'POST' and request.POST.get('action') == 'Cancelar':
        return HttpResponseRedirect("/lista/")
    elif request.method == 'POST' and request.POST.get('action') == 'Salvar':
        form = FormCadastroDizimista(request.POST, request.FILES, instance=dizimista)
        if form.is_valid():
            cadastro = form.save(commit=False)
            cadastro.usuario = request.user
            cadastro.save()

            return HttpResponseRedirect("/lista/")
    else:
        form = FormCadastroDizimista(instance=dizimista)
        dac = CadastroDizimista.objects.get(pk=nr_dizimista).datacadastro
        dam = CadastroDizimista.objects.get(pk=nr_dizimista).datamodificado
    return render_to_response("cadastro.html", {'dac': dac, 'dam': dam, 'form': form}, context_instance=RequestContext(request))

【问题讨论】:

  • 对不起。我又强调了一次代码并发现了我的错误。 “dac”必须是全局变量。我在def和voilá中将它和“dam”声明为全局!
  • 这是不正确的,在几乎所有情况下你都不应该使用全局变量。您应该为 IF 中的任何可能情况填充视图内的变量(可能在第一个 IF 之前填充它们)。它们看起来依赖于提供的变量 document_root,所以我看不出它们为什么应该是全局的。

标签: django django-views django-errors


【解决方案1】:

它不是全局变量。正如异常所说,您使用了一个未达到其分配的局部变量,这被 Python 解释器认为应该是。

def foo():
    return x

def bar1(x):
    return x

def bar2(cond):
    if cond:
        x = x
    return x

>>> import dis
>>> dis.dis(foo)
2           0 LOAD_GLOBAL              0 (x)
            3 RETURN_VALUE 

>>> dis.dis(bar1)
2           0 LOAD_FAST                0 (x)
            3 RETURN_VALUE  

>>> dis.dis(bar2)       
2           0 LOAD_FAST                0 (cond)
            3 POP_JUMP_IF_FALSE       15

3           6 LOAD_FAST                1 (x)
            9 STORE_FAST               1 (x)
           12 JUMP_FORWARD             0 (to 15)

4     >>   15 LOAD_FAST                1 (x)
           18 RETURN_VALUE 

请注意 foo 输出中的 LOAD_GLOBAL 和 bar1 和 bar2 中 RETURN_VALUE 之前的 LOAD_FAST 之间的区别,参考 http://docs.python.org/library/dis.html

该问题通常意味着代码中的逻辑不完整。对于您的代码,最好在最后一个 ELSE 中取消缩进最后两行代码。这将修复异常以及下划线逻辑问题。

【讨论】:

    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2019-04-07
    相关资源
    最近更新 更多