自定制分页组件

基于在django项目中自定制分页组件

插件:

from django.utils.safestring import mark_safe


class MyPagenation():

    def __init__(self,page_num,total_count,per_page_num,page_num_show,base_url):

        self.per_page_num = per_page_num  # 每页显示10条
        # 页面生成页码的数量
        self.page_num_show = page_num_show  
        self.base_url = base_url  # 
        try:
            page_num = int(page_num)
        except Exception:
            page_num = 1
        self.page_num = page_num

        shang, yu = divmod(total_count, self.per_page_num)  # shang:商    yu:余数
        # 总页码数
        if yu:
            page_num_count = shang + 1
        else:
            page_num_count = shang
        self.page_num_count = page_num_count
        if page_num <= 0:
            page_num = 1
        elif page_num > page_num_count:
            page_num = page_num_count

        # 3 4 5 6 7    4 5 6 7 8 9 10
        half_show = self.page_num_show // 2  # 2
        if page_num - half_show <= 0:
            start_page_num = 1
            end_page_num = self.page_num_show + 1  # 9

        elif page_num + half_show > page_num_count:
            start_page_num = page_num_count - self.page_num_show + 1  # 26 - 5 = 21
            end_page_num = page_num_count + 1  # 27  [21,22,23,24,25,26]
        else:
            start_page_num = page_num - half_show  # 4  1
            end_page_num = page_num + half_show + 1  # 9  6

        self.start_page_num = start_page_num
        self.end_page_num = end_page_num

    @property
    def start_data_num(self):
        return (self.page_num - 1) * self.per_page_num

    @property
    def end_data_num(self):
        return self.page_num * self.per_page_num

    def page_hmtl(self):
        page_num_range = range(self.start_page_num, self.end_page_num)
        page_html = ''
        page_pre_html = '<nav aria-label="Page navigation"><ul class="pagination">'
        page_html += page_pre_html
        first_page_html = '<li><a href="{1}?page={0}" aria-label="Previous"><span aria-hidden="true">首页</span></a></li>'.format(1, self.base_url)
        page_html += first_page_html
        if self.page_num <= 1:
            pre_page = '<li class="disabled"><a href="javascript:void(0)" aria-label="Previous"><span aria-hidden="true">«</span></a></li>'.format(self.page_num - 1)
        else:
            pre_page = '<li><a href="{1}?page={0}" aria-label="Previous"><span aria-hidden="true">«</span></a></li>'.format(self.page_num - 1,self.base_url)

        page_html += pre_page
        for i in page_num_range:
            if i == self.page_num:
                page_html += '<li class="active"><a href="{1}?page={0}">{0}</a></li>'.format(i,self.base_url)
            else:
                page_html += '<li><a href="{1}?page={0}">{0}</a></li>'.format(i,self.base_url)
        if self.page_num >= self.page_num_count:
            page_next_html = '<li class="disabled"><a href="javascript:void(0)" aria-label="Next"><span aria-hidden="true">»</span></a></li>'.format(
                self.page_num + 1)
        else:
            page_next_html = '<li><a href="{1}?page={0}" aria-label="Next"><span aria-hidden="true">»</span></a></li>'.format(
                self.page_num + 1,self.base_url)
        page_html += page_next_html
        last_page_html = '<li><a href="{1}?page={0}" aria-label="Previous"><span aria-hidden="true">尾页</span></a></li>'.format(
            self.page_num_count, self.base_url)
        page_html += last_page_html
        end_html = '</ul></nav>'
        page_html += end_html

        return mark_safe(page_html)

在settings里做插件相关配置(配置每页显示数据,显示页码数):

PER_PAGE_NUM = 10 #每页显示多少条数据
PAGE_NUM_SHOW = 5 #显示的页码数

插件在view试图里使用示例:

def customers(request):
    #当前页  例如 1
    page_num = request.GET.get('page')
    base_url = request.path  #访问的路径

    customer_count = models.Customer.objects.all().count()

    per_page_num = settings.PER_PAGE_NUM  #每页显示多少条数据
    page_num_show = settings.PAGE_NUM_SHOW  #显示的页码数

    page_obj = MyPagenation(page_num,customer_count,per_page_num,page_num_show,base_url)

    page_html = page_obj.page_hmtl()

    customer_objs = models.Customer.objects.all().reverse()[page_obj.start_data_num:page_obj.end_data_num]
    return render(request,'saleshtml/customers.html',{'customer_objs':customer_objs,'page_html':page_html})

插件显示

猜你喜欢

转载自www.cnblogs.com/dylan123/p/12589060.html
今日推荐