Django UnboundLocalError - PullRequest
       14

Django UnboundLocalError

0 голосов
/ 25 марта 2012

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

Если я помещаю на страницу существующую запись из БД, удаляю значение из формы ввода и отправляю, я получаю 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 Ответ

1 голос
/ 25 марта 2012

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

Обратите внимание на разницу между LOAD_GLOBAL в выходных данныхдля foo и LOAD_FAST до RETURN_VALUE в bar1 и bar2, refs http://docs.python.org/library/dis.html

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

...