在python中赋值之前引用的局部变量'form'

Posted

技术标签:

【中文标题】在python中赋值之前引用的局部变量\'form\'【英文标题】:local variable 'form' referenced before assignment in python在python中赋值之前引用的局部变量'form' 【发布时间】:2020-04-10 16:21:51 【问题描述】:

这段代码总是向我显示在赋值之前引用的错误局部变量“表单”

def home(request):

    if request.method=='POST':
        form = ListForm(request.POST or None) 

    if form.is_valid(): 
        form.save() 
        all_items = list.object.all 
        messages.success(request ,('Item Has Been Added To List !')) 
        return render(request ,'home.html', 'all_items': all_items) 
    else : 
        all_items = list.object.all 
        return render(request, 'home.html', 'all_items': all_items)

【问题讨论】:

为什么不将代码粘贴到问题中? 在此处发布您的代码而不是链接 请不要将您的代码发布为图片。 如果request.method'GET'form 会是什么? 我想添加项目,所以它不会被发布 【参考方案1】:

变量 form 仅在条件 request.method == 'POST' 满足时才定义,否则函数范围内将没有 from 变量。为了解决您的问题,代码应如下所示:

if request.method=='POST':
   form = ListForm(request.POST)
else:
   form = ListForm(None)

【讨论】:

我不明白你的想法 只有在 request.method == 'POST' 时才定义 'from' 变量,否则函数范围内将没有 from 变量。为了解决您的问题,代码应如下所示: if request.method=='POST': form = ListForm(request.POST) else: form = ListForm(None)【参考方案2】:
def home(request):
    all_items = list.object.all()
    if request.method=='POST':
        form = ListForm(request.POST or None) 
        if form.is_valid(): 
            form.save() 
            messages.success(request ,('Item Has Been Added To List !')) 
            return redirect('home.html') 
    else :
        form = ListForm()
    return render(request, 'home.html', 'all_items': all_items, 'form': form)

如果出现获取请求,表单将再次被抛出给用户

【讨论】:

我试过了,但这次出现了 AttributeError【参考方案3】:

您可以这样做,因为该语句将在 and 的左侧进行断路

if 'form' in locals() and form.is_valid(): 
    ... do something

【讨论】:

你是if 'form' in locals()还是if form in locals() if 'form' in locals() 这很奇怪。无论如何,我只会在 def 之后将其定义为form = None。然后做一个if form and form.is_valid():,这应该会让你继续前进。【参考方案4】:
def home(request):
    if request.method == 'POST':
      form = ListForm(request.POST or None)
      form = ListForm(request.POST)  
        if form.is_valid():
            form.save()
            all_items = list.objects.all
            messages.success(request, ('Item has been added to do list!'))
            return render(request, "home.html", 'all_itmes':all_items)
        else:
            print(form.errors)
            return HttpResponse(form.errors)
    else:
        all_items = list.objects.all
        return render(request, "home.html", 'all_itmes':all_items)

【讨论】:

我试过这个答案,它嵌套在 else 和 if 中工作

以上是关于在python中赋值之前引用的局部变量'form'的主要内容,如果未能解决你的问题,请参考以下文章

在装饰方法中赋值之前引用的局部变量

赋值前引用的局部变量

Django:UnboundLocalError:在赋值之前引用的局部变量'company'

Pycharm - 禁用'局部变量'xxx'可能在分配之前被引用'

python中变量的引用、可变和不可变类型、局部变量和全局变量

在python中的赋值错误之前引用的变量[重复]