自定义分页器

自定义分页器

前言:

  • web开发的三大框架  django、flask、tornado中,只有django内部封装了一个分页器组件。所以以后用其他框架的时候就得自己写一个。所以封装了一个分页器。

自定义分页器思路:

  1. 创建处理分页器的类;
  2. 根据分页码数对所有数据库数据进行切割拿到页面数据;
  3. 输入分页html,即:[上一页][1][2][3][4][5][下一页]

 

示例:

  • 定义了一个分页器类
class Pagination:
    def __init__(self, page_num, total_num, per_page_num=10, max_show=11):
        # 参数说明:
            # page_num:当前页码数;
            # total_num:总页码数
            # per_page_num:每张页面呈现的数据量
            # 页面所有页码数按钮
        self.page_num = page_num
        self.total_num = total_num
        self.per_page_num = per_page_num
        self.max_show = max_show
        self.half_show = self.max_show // 2
        self.total_page, more = divmod(total_num, per_page_num)
        if more:
            self.total_page += 1
        if self.page_num > self.total_page:
            self.page_num = self.total_page
        elif self.page_num < 1:
            self.page_num = 1
    @property
    def start(self):
        return (self.page_num - 1) * self.per_page_num

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

    @property
    def page_html(self):
        page_start = self.page_num - self.half_show
        page_end = self.page_num + self.half_show + 1
        if self.page_num + self.half_show >= self.total_page:
            page_end = self.total_page + 1
            page_start = self.total_page - self.max_show + 1
        if self.page_num <= self.half_show:
            page_start = 1
            page_end = self.max_show + 1
        page_num_list = []

        # 添加首页
        page_num_list.append('<li><a href="/user_list/?page={0}">首页</a></li>'.format(1))
        # 添加上一页
        pre_page_num = self.page_num - 1
        if pre_page_num < 1:
            page_num_list.append(
                '<li class="disabled"><a href="/user_list/?page={0}">上一页</a></li>'.format(pre_page_num))
        else:
            page_num_list.append('<li><a href="/user_list/?page={0}">上一页</a></li>'.format(pre_page_num))

        for i in range(page_start, page_end):
            if i == self.page_num:
                page_num_list.append('<li class="active"><a href="/user_list/?page={0}">{0}</a></li>'.format(i))
            else:
                page_num_list.append('<li><a href="/user_list/?page={0}">{0}</a></li>'.format(i))
        # 添加下一页
        next_page_num = self.page_num + 1
        if next_page_num > self.total_page:
            page_num_list.append(
                '<li class="disabled"><a href="/user_list/?page={0}">下一页</a></li>'.format(next_page_num))
        else:
            page_num_list.append('<li><a href="/user_list/?page={0}">下一页</a></li>'.format(next_page_num))

        # 添加尾页
        page_num_list.append('<li><a href="/user_list/?page={0}">尾页</a></li>'.format(self.total_page))

        # 将所有page_num_list的所有li标签拼接成字符串 传到对应的页面
        page_html = ''.join(page_num_list)



        return page_html
pagination.py
  • 在视图函数中实例化一个分页器对象,拿到页面的html。
from . import pagination
def xxxxxx(request):
    try:
        page_num = int(request.GET.get('page', 1))
        #从页面url抓取访问页码数
    except Exception:
        page_num = 1

    page_obj =pagination.Pagination(page_num,len(data))

    data1 = data[page_obj.start:page_obj.end]
    return render(request, 'user_list.html', {'user_list': data1, 'page_html': page_obj.page_html})
views.py
  • 在模板渲染分页器
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
</head>
<body>
<div class="container">
    <table class="table table-bordered">
        <thead>
        <tr>
            <th>姓名</th>
            <th>年龄</th>
        </tr>
        </thead>
        <tbody>
        {% for user in user_list %}
            <tr>
                <td>{{ user.name }}</td>
                <td>{{ user.age }}</td>
            </tr>
        {% endfor %}


        </tbody>
    </table>
</div>

<div class="text-center">
    <nav aria-label="Page navigation">
        <ul class="pagination">

            {{ page_html|safe }}
        </ul>
    </nav>

</div>
</body>
</html>
xxx.html

 

 

 

这样一个自定义分页器就ok啦。。

 

  

posted on 2018-07-21 13:52  弃疾  阅读(74)  评论(0)    收藏  举报

导航