2012-03-24 2 views
0

У меня есть простой набор форм, используемый для регистрации донора в моей базе данных.Django UnboundLocalError

Если я приземляюсь на страницу с существующей записью из БД и удаляю значение из ввода формы и отправляю, я получаю 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» должен быть глобальным var. Я объявил это и «плотина» как глобальная внутри def и voilá! – rjdsantos

+0

Это неверно, почти во всех случаях вы не должны использовать глобальные переменные. Вы должны заполнить эти переменные внутри представления для любого возможного случая в IF's (возможно, заполнить их перед первым IF). Они выглядят зависимыми от предоставленной переменной document_root, поэтому я не вижу никакого способа, почему они должны быть глобальными. – ilvar

ответ

1

Это не глобальная переменная. Вы использовали локальную переменную без ее назначения, которая, как полагали, должна была быть интерпретатором 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 

Пожалуйста, обратите внимание на разницу между LOAD_GLOBAL на выходе обув и LOAD_FAST перед тем return_value в BAR1 и BAR2, рефов http://docs.python.org/library/dis.html

Проблема, как правило, означает неполную логику в коде. Для вас код, лучше отменить последние две строки кода внутри последнего ELSE. Это позволит исправить исключение, а также подчеркнуть логическую проблему.

Смежные вопросы