2012-03-24 10 views
0

Ich habe ein einfaches Formset verwendet, um einen Spender zu meiner Datenbank zu registrieren.Django UnboundLocalError

Wenn ich auf der Seite einen vorhandenen Eintrag aus der DB landen und einen Wert aus einer Formulareingabe entfernen und abschicken bekomme ich einen 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

Entschuldigung. Ich habe noch einmal auf Code hingewiesen und meine Schuld entdeckt. der "dac" muss eine globale Variable sein. Ich erklärte es und "dam" als global inside def und voilá! – rjdsantos

+0

Das ist falsch, in fast allen Fällen sollten Sie keine globalen Variablen verwenden. Sie sollten diese Variablen in der Ansicht für jeden möglichen Fall in IFs auffüllen (möglicherweise füllen sie vor der ersten IF). Sie scheinen von der bereitgestellten Variablen document_root abhängig zu sein, daher sehe ich keinen Grund, warum sie global sein sollten. – ilvar

Antwort

1

Es ist nicht globale Variable. Sie haben eine lokale Variable verwendet, ohne die von Python interpretierte Aufgabe zu erfüllen, was die Ausnahme sein sollte.

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 

Bitte beachten Sie den Unterschied zwischen LOAD_GLOBAL in der Ausgabe von foo und LOAD_FAST vor RETURN_VALUE in bar1 und bar2, Refs http://docs.python.org/library/dis.html

Das Problem in der Regel bedeutet, unvollständige Logik im Code. Für Sie Code, besser die letzten zwei Codezeilen innerhalb der letzten ELSE einziehen. Dies wird sowohl die Ausnahme als auch das Logikproblem beheben.