Django视图函数保存表单数据时return语句的执行顺序是怎样的?
Django图书借阅视图return语句执行顺序详解
Python 函数遵循从上到下逐行执行的逻辑,只要遇到return语句就会立刻终止当前函数的运行,将结果返回,不存在先执行末尾return再跳回前面逻辑的可能。你产生误解大概率是把「两次独立的HTTP请求的执行流程」当成了同一次函数调用的流程。
相关视图函数代码如下:
def issuebook_view(request): form=forms.IssuedBookForm() if request.method=='POST': #now this form have data from html form=forms.IssuedBookForm(request.POST) if form.is_valid(): obj=models.IssuedBook() obj.enrollment=request.POST.get('enrollment2') obj.isbn=request.POST.get('isbn2') bk = models.Book.objects.get(isbn = obj.isbn) if bk.available_copies == 0: return render(request,'library/booksover.html') if bk.available_copies > 0: bk.available_copies = bk.available_copies - 1 bk.save() obj.save() return render(request,'library/bookissued.html') return render(request,'library/issuebook.html',{'form':form})
以下是三种实际运行场景的执行顺序:
场景1:用户首次访问借阅页面(GET请求)
- 逐行执行首先创建空白的
IssuedBookForm实例 - 判断
request.method=='POST'结果为False,直接跳过整个POST请求处理的代码块 - 直接执行函数末尾的
return render(request,'library/issuebook.html',{'form':form}),返回带空白表单的借阅页面,函数运行结束。
场景2:用户提交表单但内容不符合校验规则(POST请求+校验失败)
- 先创建空白表单实例
- 判断是POST请求,进入POST处理分支,用用户提交的表单数据初始化表单
- 执行
form.is_valid()校验失败,跳出校验通过的分支代码块,也结束了POST分支的执行 - 执行末尾的return语句,将带有错误提示的表单返回给借阅页面,函数运行结束。
场景3:用户提交表单且内容符合校验规则(POST请求+校验通过)
- 前面几步和场景2一致,进入
form.is_valid()为True的分支 - 先创建借阅记录实例,查询对应的图书信息
- 分支3-1:如果图书可借库存为0,直接执行
return render(request,'library/booksover.html'),返回库存不足页面,函数立刻终止,后续扣库存、保存借阅记录的代码以及末尾的return都不会执行 - 分支3-2:如果图书可借库存大于0,扣减库存保存后再保存借阅记录,然后执行
return render(request,'library/bookissued.html'),返回借阅成功页面,函数立刻终止,不会走到末尾的return。
- 分支3-1:如果图书可借库存为0,直接执行
误区澄清
你以为的「先返回表单再跳回处理逻辑」是两次完全独立的请求:第一次GET请求走场景1的流程返回表单页面,用户填完表单点击提交后浏览器发起第二次POST请求,视图函数重新启动执行场景2或3的流程,两次请求对应视图函数的两次独立运行,不是同一次运行里来回跳转。
内容的提问来源于stack exchange,提问作者Shivam Gupta
相关产品推荐
相关产品推荐

