列表分页
在stark组件中创建一个utils模块
utils/pagination.py
from django.utils.safestring import mark_safe class Pagination(object): def __init__(self,current_page,all_count,base_url,query_params,per_page=3,pager_page_count=11): """ :param current_page: 当前页 :param all_count: 数据总条数 :param base_url:当前url :param query_params:url中查询参数 :param per_page: 每页显示数据条数 :param pager_page_count: 最多显示的页码数 """ self.base_url=base_url self.query_params=query_params try: self.current_page=int(current_page) if self.current_page<=0: raise Exception() except Exception as e: self.current_page=1 self.per_page=per_page self.all_count=all_count self.pager_page_count=pager_page_count pager_count,b=divmod(all_count,per_page) if b!=0: pager_count+=1 self.pager_count=pager_count half_pager_page_count=int(pager_page_count/2) self.half_pager_page_count=half_pager_page_count @property def start(self): return (self.current_page-1)*self.per_page @property def end(self): return self.current_page*self.per_page def html(self): #如果总页码数小于最多显示的页码数 if self.pager_count<self.pager_page_count: pager_start=1 pager_end=self.pager_count else: #总页数超过11页 #判断当前页是否小于显示展示最多页码的一半 if self.current_page<=self.half_pager_page_count: pager_start=1 pager_end=self.pager_page_count else: #当前页码+5后大于总页码 if(self.current_page + self.half_pager_page_count) > self.pager_count: pager_end=self.pager_count pager_start=self.pager_count-self.pager_page_count+1 else: pager_start=self.current_page-self.half_pager_page_count pager_end=self.current_page+self.half_pager_page_count page_list=[] if self.current_page <=1: prev="<li><a href='#'>上一页</a></li>" else: self.query_params['page']=self.current_page-1 prev="<li><a href='%s?%s'>上一页</a></li>" % (self.base_url,self.query_params.urlencode()) page_list.append(prev) self.query_params['page']=2 for i in range(pager_start,pager_end+1): self.query_params['page']=i if self.current_page==i: tpl="<li class='active'><a href='%s?%s'>%s</a></li>" % (self.base_url,self.query_params.urlencode(),i) else: tpl = "<li><a href='%s?%s'>%s</a></li>" % (self.base_url, self.query_params.urlencode(), i) page_list.append(tpl) if self.current_page >=self.pager_count: nex="<li><a href='#'>下一页</a></li>" else: nex="<li><a href='%s?%s'>下一页</a></li>" % (self.base_url,self.query_params.urlencode()) page_list.append(nex) html=''.join(page_list) return mark_safe(html)
在service/stark.py中添加分页组件
导入pagination模块 from stark.utils.pagination import Pagination #获取参数中的当前页 page_num=request.GET.get('page') #满足过滤条件的总数据条数 total_count=self.model_class.objects.filter(conn).count() #copy一个request.GET的QuerySet对象 query_params=self.request.GET.copy() #将QuerySet的mutable设置为True,使其可修改 query_params.mutable=True page=Pagination(current_page=page_num,all_count=total_count,base_url=self.reverse_list_url(),query_params=query_params) #获取需要的数据,通过列表方式截断 query_set = self.model_class.objects.filter(conn).order_by(*self.get_order_by())[page.start:page.end]
前端模板中添加一个页码
<nav aria-label="Page navigation"> <ul class="pagination pull-right"> {{ page_html.html }} </ul> </nav>
刷新页面
PS:当分页代码给flask用时,flash的request中没有urlencode()方法,
我们传入query_params的时候就不能传入QuerySet对象,这时需传入字典,再通过urllib模块来编码
from urllib.parse import urlencode info={'k1':'v1','k2':['v2','v3']} v=urlencode(info) print(v)