2012-03-24 142 views
0

我有一個簡單的formset用於將捐助者註冊到我的數據庫。Django UnboundLocalError

如果我在頁面上着陸一個來自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)) 
+1

對不起。我再次強調代碼並發現我的錯誤。 「dac」必須是全球變量。我把它和「dam」聲明爲def和voilá中的全局內容! – rjdsantos 2012-03-24 21:43:31

+0

這是不正確的,在幾乎所有情況下,你都不應該使用全局變量。您應該在視圖中爲IF中的任何可能情況填充該變量(可能會在第一個IF之前填充它們)。他們看起來依賴於提供的變量document_root,所以我沒有看到它們爲什麼應該是全局的。 – ilvar 2012-03-25 02:27:32

回答

1

這不是全局變量。你已經使用了一個本地變量w/o來達到它的賦值,這被Python認爲應該是解釋器,就像Exception說的那樣。

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_FAST的輸出LOAD_GLOBAL之間的差異在BAR1和BAR2 RETURN_VALUE前,裁判http://docs.python.org/library/dis.html

問題通常是指在不完全的代碼邏輯。對於你的代碼,最好是在最後一個ELSE裏面最後兩行代碼的unindent。這將修復異常以及強調邏輯問題。