python分页组件,直接就拿来用

python分页组件

导入Pagination

# 1. 在后端视图函数中
def index(request, project_id):
    queryset = models.Issues.objects.filter(project_id=project_id) # 从数据库中拿到数据对象
    page_object = Pagination(
        current_page=request.GET.get('page'),  # 拿到前端页码数据
        all_count=queryset.count(),  # 数据总数
        base_url=request.path_info,  # 获取url
        query_params=request.GET  # QueryDict对象,内部含所有当前URL的原条件
    )
    issues_object_list = queryset[page_object.start:page_object.end]

    context = {
        'issues_object_list': issues_object_list,
        'page_html': page_object.page_html()
    }
    return render(request, 'index.html', context)

# 2. 前端
.........
.........
	<div>
	    {% for item in issues_object_list %}
	        {{item.xxx}}
	    {% endfor %}
	
		{{ page_html }}
	</div>
........
........

分页组件代码

from django.utils.safestring import mark_safe

class Pagination(object):
    def __init__(self, current_page, all_count, base_url, query_params, per_page=30, pager_page_count=11):
        """
        分页初始化
        :param current_page: 当前页码
        :param per_page: 每页显示数据条数
        :param all_count: 数据库中总条数
        :param base_url: 基础URL
        :param query_params: QueryDict对象,内部含所有当前URL的原条件
        :param pager_page_count: 页面上最多显示的页码数量
        """
        self.base_url = base_url
        try:
            self.current_page = int(current_page)
            if self.current_page <= 0:
                self.current_page = 1
        except Exception as e:
            self.current_page = 1

        query_params = query_params.copy()
        query_params._mutable = True
        self.query_params = query_params
        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:
        """
        if self.all_count == 0:
            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 = []

        # 首页
        self.query_params['page'] = 1
        first_page_html = '<nav aria-label="Page navigation"><ul class="pagination"><li><a href="{1}?{0}" aria-label="Previous"><span aria-hidden="true">首页</span></a></li>' \
            .format(self.query_params.urlencode(), self.base_url)
        page_list.append(first_page_html)

        # 上一页
        if self.current_page <= 1:
            prev = '<li><a href="#"><i class="fa fa-angle-double-left" aria-hidden="true"></i> 上一页</a></li>'
        else:
            self.query_params['page'] = self.current_page - 1
            prev = '<li><a href="%s?%s"><i class="fa fa-angle-double-left" aria-hidden="true"></i> 上一页</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="#">下一页 <i class="fa fa-angle-double-right" aria-hidden="true"></i></a></li>'
        else:
            self.query_params['page'] = self.current_page + 1
            nex = '<li><a href="%s?%s">下一页 <i class="fa fa-angle-double-right" aria-hidden="true"></i></a></li>' % (self.base_url, self.query_params.urlencode(),)
        page_list.append(nex)

        # 尾页
        self.query_params['page'] = self.pager_count
        last_page_html = '<li><a href="{0}?{1}" aria-label="Previous"><span aria-hidden="true">尾页</span></a></li>' \
            .format(self.base_url, self.query_params.urlencode())
        page_list.append(last_page_html)

        #  共xx条数据,页码x/x页
        if self.all_count:
            tpl = "<li class='disabled'><a>共 %s 条数据,页码 %s/%s 页</a></li></ul></nav>" % (
                self.all_count, self.current_page, self.pager_count,)
            page_list.append(tpl)

        page_str = "".join(page_list)
        return mark_safe(page_str)

(完!)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值