"在分配之前引用的局部变量"声明变量与导入的类相同时出错

时间:2016-12-16 15:34:08

标签: python django python-2.7

local variable 'Document' referenced before assignment

我继续获取此变量未绑定错误,但我似乎不明白为什么。

导入它似乎很好。我正在使用django 1-10

from django.shortcuts import render

# Create your views here.
from forms import DocumentForm
from models import Document

def SaveDocument(request):
    saved = False
    if request.method == "POST":
        #Get the posted form
        MyDocumentForm = DocumentForm(request.POST, request.FILES)

        if MyDocumentForm.is_valid():
            print 'It enters here'
            Document = Document()
            Document.name = MyDocumentForm.cleaned_data["name"]
            Document.document = MyDocumentForm.cleaned_data["document"]
            Document.save()
            saved = True
        else:
            print 'Fails'
    else:
        MyDocumentForm = DocumentForm()

    return render(request, 'saved.html', locals())

2 个答案:

答案 0 :(得分:3)

问题是你只需在SaveDocument()函数中重新定义Document。 只需将本地变量重命名为document而不是Document

document = Document()

答案 1 :(得分:2)

当Python解析函数定义的主体并遇到诸如

之类的赋值时
foo = ...

Python默认将foo解释为局部变量。

因此,当你提到:

Document = Document()

Document功能无法再访问导入的SaveDocument()。为了使其工作,请将其更改为:

document = Document()

并在其余代码中使用document的引用。

您可以通过告诉Python使用global Document引用(可让您执行当前代码)来验证这一点

global Document 
Document = Document()  
# NOTE: Do not use this in actual code. It is bad practice to 
# override the imported modules, class, function with the variable names

根据Python的The global statement文档:

  

全局语句是一个声明,它包含整个当前代码块。这意味着列出的标识符将被解释为全局变量。没有全局变量就不可能分配给全局变量,尽管自由变量可以引用全局变量而不被声明为全局变量。