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 ответ
Это не глобальная переменная. Вы использовали локальную переменную без достижения ее присваивания, которая, как считалось, должна быть интерпретатором 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 в выводе foo и LOAD_FAST перед RETURN_VALUE в bar1 и bar2, ссылки http://docs.python.org/library/dis.html
Проблема обычно означает неполную логику в коде. Для вашего кода лучше удалить отступы двух последних строк кода внутри последнего ELSE. Это исправит исключение, а также подчеркнет проблему логики.