一、custom.html

<!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">
    <link rel="stylesheet" href="/static/plugins/font-awesome-4.7.0/css/font-awesome.css">
</head>
<body>
    <h1>用户列表</h1>
    <table  class="table table-striped table table-bordered table table-hover">
            <tr>
                <td>姓名</td>
                <td>年龄</td>
                <td>地址</td>
            </tr>
        {% for row in user_list %}
            <tr>
                <td>{{ row.username }}</td>
                <td>{{ row.age }}</td>
                <td>{{ row.address }}</td>
            </tr>
        {% endfor %}

    </table>
    <nav aria-label="Page navigation">
        <ul class="pagination">
          {{ page_info.pager|safe }}
        </ul>
    </nav>
</body>
</html>

二、view.py下的函数

def custom(request):
    # 获取路径信息
    url = request.META['PATH_INFO']
    # 得到数据条数
    all_count = models.UserInfo.objects.all().count()
    # 创建Pager对象
    page_info = Pager(request.GET.get('page'), all_count, 10, url)
    # 获取当前页需要的User对象数组
    user_list = models.UserInfo.objects.all()[page_info.start():page_info.end()]
    print(page_info.start(), page_info.end())
    for u in user_list:
        print(u.username)
    return render(request, 'custom.html', {'user_list': user_list, 'page_info': page_info})

三、Pager插件

class Pager(object):
    def __init__(self, current_page, data_count, page_size, base_url, show_page=5):
        """
        :param current_page:    当前页
        :param data_count:      数据行总数
        :param page_size:       页大小(每一页包含的数据行数)
        :param base_url:        跳转页面的url
        :param show_page:       需要显示的页数
        """

        self.data_count = data_count
        self.page_size = page_size
        self.base_url = base_url
        self.all_page = (self.data_count + self.page_size - 1) // self.page_size
        self.show_page = self.all_page if show_page > self.all_page else show_page
        try:
            self.current_page = int(current_page)
        except Exception as e:
            self.current_page = 1

    def start(self):
        """
        :return: 数据起始位置
        """
        print("页大小:" + str(self.page_size) + "--当前页: " + str(self.current_page))
        return self.page_size * (self.current_page - 1)

    def end(self):
        """
        :return: 数据末尾位置
        """
        return self.page_size * self.current_page
    def pageList(self):
        start, end = 1, self.show_page + 1
        half_show_page = (self.show_page - 1) // 2

        if half_show_page < self.current_page < self.all_page - half_show_page:
            start = self.current_page - half_show_page
            end = self.current_page + half_show_page + 1
            # > 10 - 2
        elif self.current_page >= self.all_page - half_show_page:
            end = self.all_page + 1
            start = end - self.show_page
        return [i for i in range(start, end)]

    def pager(self):
        # 组装‘上一页’选项
        page_list = []
        if self.current_page <= 1:
            prev = "<li><a href='#'>上一页</a></li>"
        else:
            prev = "<li><a href='%s?page=%s'>上一页</a></li>" % (self.base_url, self.current_page - 1,)
        page_list.append(prev)

        # 组装中间页码数显示
        for i in self.pageList():
            if i == self.current_page:
                temp = "<li class='active'><a  href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i,)
            else:
                temp = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i,)
            page_list.append(temp)

        # 组装'下一页'选项
        if self.current_page >= self.all_page:
            nex = "<li><a href='#'>下一页</a></li>"
        else:
            nex = "<li><a href='%s?page=%s'>下一页</a></li>" % (self.base_url, self.current_page + 1,)
        page_list.append(nex)
        return ''.join(page_list)