自定义页码

自定义页码

 

目的

通过使用Python代码基于BootStrap控件的基础上,实现页码插件的功能

 

目标

用户输入一些必要的参数,通过这个插件可以获得应该在页面上显示的数据起始位置和结束位置以及页码标签的html代码,该内容只是单纯的页码代码,外面应该自己写上如下代码:

<ul class="pagination" style="margin: 0;">
    {{ pager.page_html|safe }}
</ul>

 

流程

用户实例化这个对象的时候需要传入如下参数:

current_page:当前页码(用户前端点击的页码数字)
all_count:分页之前在页面上一共显示多少条数据
base_url:点击页码后提交的url
query_params:request里GET中的数据,用来保证搜索条件不变
per_page=10:每页最多显示的数据条数,默认为10条
pager_page_count=11:页码器最多展示多少个页码,默认为11个

通过上面参数应该可以获取到以下数据

start  数据索引值的起始索引(分页完成后的)

end   数据索引值得结束索引(分页完成后的)

page_html()    生成HTML的页码 --》可以根据需要,修改这里的标签

 

 

代码:

class Page(object):
    def __init__(self, current_page, all_count, base_url, query_params, per_page=10, pager_page_count=11):
        """
        分页初始化
        :param current_page: 当前页码
        :param per_page: 每页显示数据条数
        :param all_count: 数据库中总条数
        :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:
        """
        return (self.current_page - 1) * self.per_page

    @property
    def end(self):
        """
        数据获取值结束索引
        :return:
        """
        return self.current_page * self.per_page

    def page_html(self):
        """
        生成HTML页码
        :return:
        """
        # 如果数据总页码pager_count<11 pager_page_count
        if self.pager_count < self.pager_page_count:
            pager_start = 1
            pager_end = self.pager_count
        else:
            # 数据页码已经超过11
            # 判断: 如果当前页 <= 5 half_pager_page_count
            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)
        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:
            self.query_params['page'] = self.current_page + 1
            nex = '<li><a href="%s?%s">下一页</a></li>' % (self.base_url, self.query_params.urlencode(),)
        page_list.append(nex)
        page_str = "".join(page_list)
        return page_str

  

 

posted on 2017-11-05 22:56  何必从头  阅读(260)  评论(0)    收藏  举报

导航