2012-03-24 2 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"는 전역 변수 여야합니다. 나는 그것을 선언했고 "댐"을 글로벌 데프와 보일 안에 넣었다! – rjdsantos

+0

맞지 않습니다. 대부분의 경우 전역 변수를 사용하지 않아야합니다. IF의 모든 가능한 경우에 대해 뷰 내부에 해당 변수를 채워야합니다 (어쩌면 첫 번째 IF 전에 값을 채 웁니다). 그들은 제공된 변수 document_root에 종속적 인 것처럼 보이므로 전 세계에 있어야하는 이유가 없습니다. – ilvar

답변

1

는 전역 변수 아니다. 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 

, BAR1과 바 2에 RETURN_VALUE 전에 foo에와 LOAD_FAST의 출력 LOAD_GLOBAL의 차이를주의 심판 http://docs.python.org/library/dis.html

문제는 일반적으로 코드에서 불완전한 논리를 의미한다. 코드의 경우 마지막 ELSE 내부의 마지막 두 줄을 들여 쓰는 것이 좋습니다. 이렇게하면 논리 문제에 밑줄을 치는 것뿐만 아니라 예외가 수정됩니다.