【django】分页组件

from django.utils.safestring import mark_safe
class Paging:
    def __init__(self,current_page_number,total_count,per_page_count=10,page_number_show=7,recv_data=None):
        """
        :param current_page_number:   当前页码
        :param total_count:           总数据量
        :param per_page_count:        每页显示条数
        :param page_number_show:      总显示页码
        :param start_page_number:     起始页码
        :param end_page_number:       结束页码
        """
    
        self.recv_data = recv_data # 用作保存查询条件,只做分页不做查询时可以忽略
        try:
            current_page_number = int(current_page_number)
            # 验证页码是否是数字
        except Exception:
            current_page_number = 1

        a, b = divmod(total_count, per_page_count)
        # divmod:返回一个包含商和余数的元组
        if b:
            total_page_count = a + 1
            # 如果余数不为0显示总页码为商加1
        else:
            total_page_count = a
            # 如果余数为0则商就是总页码
            
        # total_page_count 总页码数
        
        if current_page_number <= 0:
            current_page_number = 1
            # 当页码小于0时默认显示第1页

        if current_page_number >= total_page_count:
            current_page_number = total_page_count
            # 如果当前页码大于总页码默认显示最后一页
        half_number = page_number_show // 2
        # half_number用作计算起始页码和结束页码
        start_page_number = current_page_number - half_number
        # 起始页码
        end_page_number = current_page_number + half_number + 1
        # 结束页码

        if start_page_number <= 0:
            # 防止起始页码变为负数
            start_page_number = 1
            end_page_number = page_number_show + 1

        if end_page_number >= total_page_count:
            # 防止结束页码超出总页码数
            start_page_number = total_page_count - page_number_show + 1
            end_page_number = total_page_count + 1

        if total_page_count < page_number_show:
            # 防止数据不足填充全部显示页码
            start_page_number = 1
            end_page_number = total_page_count + 1

        self.current_page_number = current_page_number
        self.per_page_count = per_page_count
        self.total_page_count = total_page_count
        self.start_page_number = start_page_number
        self.end_page_number = end_page_number

    @property
    def start_data_number(self):
        # 数据切片起始值
        return (self.current_page_number - 1) * self.per_page_count

    @property
    def end_data_number(self):
        # 数据切片结束值
        return self.current_page_number*self.per_page_count

    def page_html_func(self):
        # 生成html
        page_html = """
                   <nav aria-label="Page navigation">
                     <ul class="pagination">

                   """
        self.recv_data['page'] = 1
        first_page = f"""
                       <li>
                         <a href="?{self.recv_data.urlencode()}" aria-label="Previous">
                           <span aria-hidden="true">首页</span>
                         </a>
                       </li>"""
        page_html += first_page

        self.recv_data['page'] = self.current_page_number - 1
        previous_page = f"""
                   <li>
                         <a href="?{self.recv_data.urlencode()}" aria-label="Previous">
                           <span aria-hidden="true">&laquo;</span>
                         </a>
                       </li>"""
        page_html += previous_page

        for i in range(self.start_page_number,self.end_page_number):
            self.recv_data['page'] = i
            if i == self.current_page_number:
                page_html += f'<li class="active"><a href="?{self.recv_data.urlencode()}">{i}</a></li>'
            else:
                page_html += f"""<li><a href="?{self.recv_data.urlencode()}">{i}</a></li>"""


        self.recv_data['page'] = self.current_page_number + 1
        next_page = f"""
                       <li>
                             <a href="?{self.recv_data.urlencode()}" aria-label="Next">
                               <span aria-hidden="true">&raquo;</span>
                             </a>
                           </li>
           """
        page_html += next_page

        self.recv_data['page'] = self.total_page_count
        last_page = f"""
                           <li>
                             <a href="?{self.recv_data.urlencode()}" aria-label="Previous">
                               <span aria-hidden="true">尾页</span>
                             </a>
                           </li>"""
        page_html += last_page

        page_html += """

                         </ul>
                       </nav>
                   """
        return mark_safe(page_html)

views.py:

def index(request):
	recv_data = copy.copy(request.GET) # 用作保存查询条件
	current_page_number = request.GET.get('page')  # 当前页码
	all_customers = models.Customer.objects.all() # 全部数据
	total_count = all_customers.count() # 全部数据量
	page_obj = Paging(current_page_number,total_count,per_page_count,page_number_show,recv_data)
	
	all_customers = all_customers[page_obj.start_data_number:page_obj.end_data_number] # 对数据进行切片
	page_html = page_obj.page_html_func() # 获得页码html
	return render(request, 'index.html', {
	    'all_customers ': all_customers ,
	    'page_html': page_html})

index.html

{% for objin all_customers %}
	{ customer.name }}
{% endfor %}
{{ page_html }}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值