【问题标题】: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 会是什么?
  • 我想添加项目,所以它不会被发布

标签: python django


【解决方案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 中工作
猜你喜欢
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多