实现分页时触发UnboundLocalError报错,求技术协助(Python3.6.4+Django2.0.1)
解决Django分页时遇到的UnboundLocalError问题
嘿,这个错误我之前做Django分页功能的时候也碰到过!UnboundLocalError at /org_list/ local variable 'orgs' referenced before assignment说白了就是你的视图函数里,orgs变量还没被赋值,就被传递给模板调用了。结合你提到的分页场景,我整理了几种常见的问题和修复方案:
最常见的原因:变量只在条件分支里定义
比如你的view.py里可能写了类似这样的代码:
def org_list(request): if request.method == 'GET': page = request.GET.get('page', 1) orgs = Org.objects.all() paginator = Paginator(orgs, 10) orgs = paginator.get_page(page) return render(request, 'org-list.html', {'orgs': orgs})
你看,如果请求方法不是GET(比如不小心发了POST请求),orgs根本就没被定义,直接return的时候自然会报错。
修复办法:在条件分支外面先初始化orgs,确保不管什么情况它都有值:
def org_list(request): orgs = Org.objects.all() # 先给变量一个初始值 if request.method == 'GET': page = request.GET.get('page', 1) paginator = Paginator(orgs, 10) orgs = paginator.get_page(page) return render(request, 'org-list.html', {'orgs': orgs})
另一种可能:搜索/筛选逻辑导致变量遗漏
如果你的分页还结合了搜索功能,可能会出现这种情况:
def org_list(request): keyword = request.GET.get('keyword', '') if keyword: orgs = Org.objects.filter(name__icontains=keyword) paginator = Paginator(orgs, 10) page = request.GET.get('page', 1) orgs = paginator.get_page(page) return render(request, 'org-list.html', {'orgs': orgs})
当用户没输入关键词的时候,orgs完全没被定义,自然触发错误。
修复办法:给无筛选条件的情况设置默认值,同时把分页逻辑抽出来避免重复代码:
def org_list(request): keyword = request.GET.get('keyword', '') # 先处理数据筛选 if keyword: orgs = Org.objects.filter(name__icontains=keyword) else: orgs = Org.objects.all() # 无搜索关键词时返回全部数据 # 统一处理分页 paginator = Paginator(orgs, 10) page = request.GET.get('page', 1) orgs = paginator.get_page(page) return render(request, 'org-list.html', {'orgs': orgs})
额外的小提示
当然,你也可以在org-list.html里加个简单的容错判断,比如用{% if orgs %}包裹分页相关的代码,但这只是临时的补救措施,核心还是要确保视图里orgs在return语句执行前,不管什么代码路径都已经被赋值了。
你可以先检查下自己的view.py,看看是不是属于上面的某一种情况,应该很快就能解决!
内容的提问来源于stack exchange,提问作者Liu Harry
相关产品推荐
相关产品推荐

