列表分页

编辑本博客

分页组件代码

在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)
View Code

在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]
View Code

 前端模板中添加一个页码

<nav aria-label="Page navigation">
    <ul class="pagination pull-right">
        {{ page_html.html }}
    </ul>
</nav>    
View Code

刷新页面

 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)
View Code

 

posted @ 2018-09-11 12:15  丫丫625202  阅读(86)  评论(0编辑  收藏  举报