分页功能

from django.utils.safestring import mark_safe
from django.http import QueryDict

class Paginnation:

    def __init__(self, request, total_data,quary_parameter=QueryDict(), show_max=11, each_num=10):
        self.quary_parameter = quary_parameter
        self.quary_parameter._mutable = True  #设置成True
        self.base_url = request.path_info
        # 最多显示页数
        self.show_max = show_max
        show_half = show_max // 2
        # 每页显示的数据条数
        self.each_num = each_num
        # 总数据
        self.total_data = total_data
        # 显示的页码数
        self.total_num, more = divmod(total_data, each_num)
        if more:
            self.total_num += 1
        try:
            self.current_page = int(request.GET.get('page', 1))
            if self.current_page <= 0:
                self.current_page = 1
            elif self.current_page > self.total_num + 1:
                current_page = self.total_num
        except Exception as e:
            current_page = 1

        # 开始页数和结束页数
        if self.total_num < show_max:  # 当数据较少时,页数不够展示的最大页数
            self.start_page = 1
            self.end_page = self.total_num
        else:
            if self.current_page <= show_half:
                self.start_page = 1
                self.end_page = self.start_page + show_max - 1
            elif self.current_page > self.total_num - show_half:
                self.start_page = self.total_num - show_max + 1
                self.end_page = self.total_num
            else:
                self.start_page = self.current_page - show_half
                self.end_page = self.current_page + show_half

    # 页面数据的起始值和结束
    @property
    def start(self):
        return (self.current_page - 1) * self.each_num
    @property
    def end(self):
        return self.current_page * self.each_num
    @property
    def html_li(self):

        # 后端代替前端
        html_list = []

        self.quary_parameter['page'] = 1
        first_li = '<li><a href = "{}?{}">首页</a></li>'.format(self.base_url,self.quary_parameter.urlencode())
        html_list.append(first_li)

        if self.current_page == 1:
            prev_li = '<li><a class="disabled"><<<</a></li>'.format(self.current_page - 1)
        else:
            self.quary_parameter['page'] = self.current_page - 1
            prev_li = '<li><a href = "{1}?{0}"><<<</a></li>'.format(self.quary_parameter.urlencode(),self.base_url)
        html_list.append(prev_li)

        for num in range(self.start_page, self.end_page + 1):
            self.quary_parameter['page'] = num
            if self.current_page == num:
                html_li = '<li class="active"><a href = "{1}?{2}">{0}</a></li>'.format(num,self.base_url,self.quary_parameter.urlencode())
            else:
                html_li = '<li><a href = "{1}?{2}">{0}</a></li>'.format(num,self.base_url,self.quary_parameter.urlencode())
            html_list.append(html_li)

        if self.current_page == self.total_num:
            next_li = '<li><a class="disabled">>>></a></li>'.format(self.current_page + 1)
        else:
            self.quary_parameter['page'] = self.current_page + 1
            next_li = '<li><a href = "{1}?{0}">>>></a></li>'.format(self.quary_parameter.urlencode(),self.base_url)
        html_list.append(next_li)
        self.quary_parameter['page'] = self.total_num
        last_li = '<li><a href = "{1}?{0}">尾页</a></li>'.format(self.quary_parameter.urlencode(),self.base_url)
        html_list.append(last_li)

        return mark_safe(''.join(html_list))

 

posted on 2018-10-28 10:16  IT东  阅读(64)  评论(0)    收藏  举报

导航