djago自带模块实现翻页功能(前后端分离写法)
django中自带了具有翻页功能的库Paginator,下面我们一起学习一下,如何用这个库来写翻页功能
一、Page的解释
我们一般不手动创造Page这个类,而是用**Paginator.page()**来调用
1.类方法
Page.has_next
() 如果有下一页,则返回True
。Page.has_previous
() 如果有上一页,返回True
。Page.has_other_pages
() 如果有上一页或下一页,返回True
。Page.next_page_number
() 返回下一页的页码。如果下一页不存在,抛出InvlidPage
异常。Page.previous_page_number
() 返回上一页的页码。如果上一页不存在,抛出InvalidPage异常。Page.start_index
() 返回当前页上的第一个对象,相对于分页列表的所有对象的序号,从1开始。比如,将五个对象的列表分为每页两个对象,第二页的start_index()
会返回3
。Page.end_index
() 返回当前页上的最后一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,将五个对象的列表分为每页两个对象,第二页的end_index()
会返回4
。
2.类属型
Page.object_list
当前页上所有对象的列表。Page.number
当前页的序号,从1开始。Page.paginator
相关的Paginator
对象。
二、异常处理
EmptyPage
:如果查询的页面超出范围,会抛出EmptyPage
这个错误
PageNotAnInteger
:如果获取的页码不是整数,会抛出PageNotAnInteger
这个错误
三、代码
class TurnThePage(View):
def post(self,request):
try:
pag = request.POST.get('page',None)
# defects = Defects.objects.all()
defects = Defects.objects.get_queryset().order_by('id')
#我这里是把他变成字典了,然后再放到列表里,如果不把他变成列表所传的必须是可序化,所传类型可以是列表,元组,查询集或其他
for i in range(len(defects)):
res_dict ={
'defects_id':defects[i].id,
'create_time':defects[i].create_time,
'update_time':defects[i].update_time,
'is_delete':defects[i].is_delete,
'defects_name':defects[i].defects_name,
'defects_status':defects[i].defects_status,
}
dicts_list.append(res_dict)
paginator = Paginator(dicts_list,3)#每页有三条数据
content = paginator.page(pag)#获取的页码
content_list = content.object_list#当前页所有对象列表
# if content.has_other_pages() == True:
# return JsonResponse({'status':200,'msg':'查询成功','date':content_list})
if content.has_next() == False:#检测是否下一页
return JsonResponse({'status':200,'msg':'这已经是最后一页','date':content_list})
elif content.has_previous() == False:#检测是否是第一页
return JsonResponse({'status':200,'msg':'这已经是第一页','date':content_list})
else:
return JsonResponse({'status':200,'msg':'查询成功','date':content_list})
#如果获得页码查出范围就返回第一页内容
except EmptyPage:
content = paginator.page(1)
content_list = content.object_list
return JsonResponse({'status': 200, 'msg': '你输入的页码查出范围', 'date':content_list})
#如果获得的页码不是整数就返回第一页内容
except PageNotAnInteger:
content = paginator.page(1)
content_list = content.object_list
return JsonResponse({'status': 200, 'msg': '您输入的页码不是整数,请输入整数', 'date': content_list})