【问题标题】:UnboundLocalError when submitting form in Django App在 Django App 中提交表单时出现 UnboundLocalError
【发布时间】:2021-04-15 22:14:18
【问题描述】:

我正在尝试提交表单但收到错误:

UnboundLocalError 在 /create/ 赋值前引用的局部变量“spr”

下面是我的views.py文件中错误突出显示的部分,具体来说:

return HttpResponseRedirect("/%i" %spr.id)

def create(response):
if response.method == "POST":
    form = CreateNewSprint(response.POST)

    if form.is_valid():
        n = form.cleaned_data["name"]
        spr = Sprint(name=n)
        spr.save()
        response.user.sprint.add(spr)

    return HttpResponseRedirect("/%i" %spr.id)

else:
    form = CreateNewSprint()
return render(response, "main/create.html", {"form": form})

我不确定为什么会发生这种情况,任何指向正确方向的指针将不胜感激。如果需要任何其他代码/信息,请告诉我。

【问题讨论】:

    标签: python python-3.x django django-forms


    【解决方案1】:

    如果form.is_valid() 返回False,那么它将旨在评估return HttpResponseRedirect("/%i" %spr.id),但在这种情况下永远不会设置spr。因此,在这种情况下,您应该重新呈现无效的表单:

    def create(response):
        if response.method == 'POST':
            form = CreateNewSprint(response.POST)
    
            if form.is_valid():
                n = form.cleaned_data['name']
                spr = Sprint(name=n)
                spr.save()
                response.user.sprint.add(spr)
                return HttpResponseRedirect('/%i' %spr.id)
    
        else:
            form = CreateNewSprint()
        return render(response, 'main/create.html', {'form': form})

    注意:您可以使用redirect(…) [Django-doc] 和 根据视图名称和参数确定 url。这比执行字符串格式化更安全、更优雅 然后将其包装在 HttpResponseRedirect object [Django-doc] 中。

    【讨论】:

    • 我曾尝试模仿上述内容,但不幸的是,在尝试提交时,未创建新的 sprint。我是否错过了什么/做错了什么?
    • @G.Hines:当然不会创建新的Sprint,因为您提交的表单无效。如果您使用{{ form }} 呈现表单,它将在表单上显示错误。您也可以print(form.errors)查看视图中的错误。
    • 嗯,当然,这是有道理的。感谢您帮助我理解!
    猜你喜欢
    • 2021-06-15
    • 2012-05-08
    • 2021-06-15
    • 2013-07-13
    • 2021-07-09
    • 2020-05-11
    • 1970-01-01
    • 2017-07-07
    • 2020-05-30
    相关资源
    最近更新 更多