【问题标题】:django local variable referenced before assignment赋值前引用的 django 局部变量
【发布时间】:2016-01-12 20:21:35
【问题描述】:

我正在创建一个 django 应用程序,但我不确定我做错了什么。我不断收到错误“分配前引用的局部变量'sigtracker'”这是错误引用的代码。我知道这与表单验证有关,但我不确定我做错了什么。

@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

【问题讨论】:

  • 发布完整的回溯并提醒我们错误中引用了哪些特定行。此外,您的缩进在该功能下是错误的。如果在您的实际代码中是这样的,那可能是您的问题。
  • 我希望你有 sigtracker 类。如果是这种情况,您可能不想调用与类相同的变量,这可能会使解析器感到困惑。

标签: python django


【解决方案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(这是针对 Python 类的 pep8 建议)。

这样,您可以轻松区分模型SigTracker 和模型实例sigtracker

如果您将模型重命名为 SigTracker,请确保在您使用它的任何地方更新您的导入和代码。

【讨论】:

  • 有趣的是,任何与局部变量命名相同的类都会发生这种情况,而不是特定于 django 模型。
  • @tdelaney 我已经重写了答案,使其不那么特定于 Django。正如你所说,这是一个常规的 Python 错误。
  • 谢谢你,这是我无法相信我错过了它的问题
猜你喜欢
  • 1970-01-01
  • 2011-10-31
  • 2020-05-05
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 2011-11-06
相关资源
最近更新 更多