Django项目中自定义分页器

django项目中数据分页展示

  1. 在项目的根目录下新建目录
  2. 在该目录中新建一个py文件,如:pagination.py
  3. 导入组件 mark_safe
  4. 自定义类 

具体实现逻辑

pagination.py文件

from django.utils.safestring import mark_safe
import copy


class Pagination:
    def __init__(self, request, all_count, max_show=9, per_num=15):
        """
        :param request: request对象
        :param all_count: 总数据量
        :param max_show: 最多显示的页码数
        :param per_num: 每页显示的数据条数
        """
        # 获取URL参数
        query_dic_url_param = copy.deepcopy(request.GET)
        # 设置为可修改
        query_dic_url_param._mutable = True
        self.query_dic_url_param = query_dic_url_param

        # 当前页码
        self.current_page = request.GET.get('page', '1')
        if self.current_page.isdecimal():
            self.current_page = int(self.current_page)
        else:
            self.current_page = 1

        # 最多显示的页码数
        self.max_show = max_show
        half_show = max_show // 2

        # 每页显示的数据条数
        self.per_num = per_num

        # 总数据量
        self.all_count = all_count

        # 总页码数
        self.total_num, more = divmod(all_count, per_num)
        if more:
            self.total_num += 1

        # 总页码数小于最大显示数,显示总页码数
        if self.total_num <= max_show:
            self.page_start = 1
            self.page_end = self.total_num
        else:
            # 总页码数大于最大显示数,最多显示11个
            if self.current_page <= half_show:
                self.page_start = 1
                self.page_end = max_show
            elif self.current_page + half_show >= self.total_num:
                self.page_end = self.total_num
                self.page_start = self.total_num - max_show + 1
            else:
                self.page_start = self.current_page - half_show
                self.page_end = self.current_page + half_show

    @property
    def start(self):
        """
        :return: start page
        """
        return (self.current_page - 1) * self.per_num

    @property
    def end(self):
        """
        :return:end page
        """
        return self.current_page * self.per_num

    @property
    def show_li(self):
        # 存放 li 代码
        html_list = []

        # 为URL设置page参数, 重新拼接设置参数后的URL
        self.query_dic_url_param.setlist('page', [1])
        if self.current_page == 1:
            first_li = '<li class="disabled"><a>首页</a></li>'
        else:
            first_li = f'<li><a href="?{self.query_dic_url_param.urlencode()}">首页</a></li>'

        html_list.append(first_li)

        if self.current_page == 1:
            prev_li = '<li class="disabled"><a> < </a></li>'
        else:
            # 为URL设置page参数, 重新拼接设置参数后的URL
            self.query_dic_url_param.setlist('page', [self.current_page - 1])
            prev_li = '<li><a href="?{}"> < </a></li>'.format(self.query_dic_url_param.urlencode())
        html_list.append(prev_li)

        for num in range(self.page_start, self.page_end + 1):
            # 为URL设置page参数, 重新拼接设置参数后的URL
            self.query_dic_url_param.setlist('page', [num])
            if self.current_page == num:
                li_html = '<li class="active"><a href="?{}">{}</a></li>'.format(self.query_dic_url_param.urlencode(), num)
            else:
                li_html = '<li><a href="?{}">{}</a></li>'.format(self.query_dic_url_param.urlencode(), num)
            html_list.append(li_html)
        if self.current_page == self.total_num:
            next_li = '<li class="disabled"><a> > </a></li>'
        else:
            # 为URL设置page参数, 重新拼接设置参数后的URL
            self.query_dic_url_param.setlist('page', [self.current_page + 1])
            next_li = '<li><a href="?{}"> > </a></li>'.format(self.query_dic_url_param.urlencode())
        html_list.append(next_li)
        if self.current_page == self.total_num:
            last_li = '<li class="disabled"><a>末页</a></li>'
        else:
            # 为URL设置page参数, 重新拼接设置参数后的URL
            self.query_dic_url_param.setlist('page', [self.total_num])
            last_li = '<li><a href="?{}">末页</a></li>'.format(self.query_dic_url_param.urlencode())
        html_list.append(last_li)

        return mark_safe(''.join(html_list))

views.py文件

def number_info(request):
    if request.method == 'GET':
        # 根据搜索条件筛选数据
        data_list = models.PrettyNumber.objects.all()

        # 实例化分页对象
        pages = Pagination(request, data_list.count())
        total_page = pages.total_num
        current_page = pages.current_page
        data_list = data_list[pages.start: pages.end]
        html_str = pages.show_li
        return render(request, 'number_info.html', locals())

 

number_info.html文件

{# 分页器 #}
<div>
    <nav aria-label="Page navigation">
        <!-- 页码条 -->
        <ul class="pagination">
            <!-- 将后端返回的html_str渲染展示到页面 -->
            {{ html_str }}
        </ul>
        <!-- 页码跳转 -->
        <li class="pagination" style="float: right">
            <form method="get" style="float:right">
                <input type="text" class="form-control" name="page" placeholder="页码"
                       style="float:left; width:60px; ; border-radius: 0">
                <button style="border-radius:0; background-color:#46464624" class="btn btn-default"
                        type="submit"><i class="fa fa-angle-double-right" aria-hidden="true"></i></button>
            </form>
        </li>
        <!-- 页码数量 -->
        <p style="float: right;margin: 27px 7px;">
            <span>第{{ current_page }}页/共{{ total_page }}页</span>
        </p>
    </nav>
</div>

最终显示效果如下

 

posted @ 2018-12-05 17:20  cnblogs用户  阅读(188)  评论(0编辑  收藏  举报