2016-01-12 2 views
-1

Im, создающее приложение django, но не уверенное в том, что я делаю неправильно. Я продолжаю получать ошибку «локальная переменная« sigtracker », на которую ссылается перед назначением« это код, на который ссылается ошибка. Я знаю, что это связано с проверкой формы, но я не уверен, что я делаю неправильно.Локальная переменная django, на которую ссылаются до назначения

@login_required 
@permission_required('auth.signiture_management') 
def add_signiture_view(request): 
logger.debug("add_signiture_view called by user %s" % request.user) 
if request.method == 'POST': 
    form = SignitureForm(request.POST) 
    logger.debug("Request type POST contains form valid: %s" %  form.is_valid()) 
    if form.is_valid(): 
     # handle valid form 
     sigtracker = sigtracker() 
     sigtracker.ident = form.cleaned_data['ident'] 
     sigtracker.system = form.cleaned_data['system'] 
     sigtracker.name = form.cleaned_data['name'] 
     sigtracker.signiture_type = form.cleaned_data['signiture type'] 
     sigtracker.status = form.cleaned_data['status'] 
     sigtracker.save() 
     logger.info("Created new signiture in %s at %s by user %s" % (sigtracker.system, request.user)) 
     return HttpResponseRedirect("/sigtracker/") 
else: 
    logger.debug("Returning new SignitureForm") 
    form = SignitureForm() 

render_items = {'form': form} 

return render_to_response('registered/addsigniture.html', render_items, context_instance=RequestContext(request)) 

Environment: 


Request Method: POST 
Request URL: http://redacted/add_signiture/ 

Django Version: 1.6.5 
Python Version: 2.7.5 
Installed Applications: 
('django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.humanize', 
'django_evolution', 
'djcelery', 
'celerytask', 
'bootstrapform', 
'authentication', 
'portal', 
'registration', 
'services', 
'eveonline', 
'groupmanagement', 
'hrapplications', 
'timerboard', 
'srp', 
'sigtracker') 
Installed Middleware: 
('django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware') 




Traceback: 
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    112.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/usr/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 
    22.     return view_func(request, *args, **kwargs) 
File "/usr/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 
    22.     return view_func(request, *args, **kwargs) 
File "/home/allianceserver/allianceauth/sigtracker/views.py" in add_signiture_view 
    46.    sigtracker = sigtracker() 

Exception Type: UnboundLocalError at /add_signiture/ 
Exception Value: local variable 'sigtracker' referenced before assignment 
+2

Отправьте полную информацию о трассировке и сообщите нам, на какие конкретные строки ссылаются на ошибку. Кроме того, ваш отступ не соответствует этой функции. Если это так в вашем фактическом коде, это может быть вашей проблемой. –

+0

Я ожидаю, что у вас есть класс сигтраккера. Если это так, вы можете не захотеть вызывать переменную так же, как класс, это может смутить парсер. –

ответ

1

Проблема заключается в этой строке

sigtracker = sigtracker() 

Вы импортировали вашу модель класса sigtracker() вне функции зрения. В Python невозможно ссылаться на этот класс внутри функции и назначать ему одно и то же имя локальной переменной.

Самое быстрое исправление - переименование экземпляра sigtracker на что-то еще, например. st:

st = sigtracker() 
    st.ident = form.cleaned_data['ident'] 
    st.system = form.cleaned_data['system'] 
    st.name = form.cleaned_data['name'] 
    st.signiture_type = form.cleaned_data['signiture type'] 
    st.status = form.cleaned_data['status'] 
    st.save() 
    logger.info("Created new signiture in %s at %s by user %s" % (st.system, request.user)) 

Это сбивает с толку, чтобы попытаться использовать sigtracker для обозначения экземпляров модели класса и модели. Рекомендуется использовать заглавные имена для ваших моделей, например. SigTracker (это рекомендация pep8 для классов Python в целом).

Таким образом, вы можете легко определить разницу между моделью SigTracker и экземпляром модели sigtracker.

Если вы переименовали модель в SigTracker, обязательно обновите свой импорт и код везде, где вы ее используете.

+0

Было бы интересно отметить, что это произойдет с любым классом с именем, аналогичным локальной переменной, и не является чем-то специфичным для модели django. – tdelaney

+0

@tdelaney Я переписал ответ, чтобы быть менее специфичным для Django. Как вы говорите, это обычная ошибка Python. – Alasdair

+0

Спасибо, что это была проблема, не верю, что я ее пропустил – user5601513

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