分页,cookie,session

分页

自定义分页

def book_list(request):
    # 1. 查询所有的书籍数
    data = models.Book.objects.all()
    # 统计下总数据条数
    total_num = data.count()
    # 从URL中提取出来当前访问的具体页码数
    try:
        current_page = int(request.GET.get("page"))
    except Exception as e:
        current_page = 1
    print(current_page)
    # 定义每一页显示10条
    per_page = 10
    # 定义页面上最多显示多少个页码
    show_page_num = 7

    half_show_page_num = show_page_num // 2

    # 当前数据总共需要多少页码
    total_page, more = divmod(total_num, per_page)
    # 如果有余数,就把页码数+1
    if more:
        total_page += 1
    # 如果当前页码数大于总页码数,默认展示最后一页的数据
    # current_page = total_page if current_page > total_page else current_page
    if current_page > total_page:
        current_page = total_page
    # 如果当前页码数小于1,默认展示第一页的数据
    if current_page < 1:
        current_page = 1

    # 求 页面上 需要展示的页码范围
    if current_page - half_show_page_num <= 1:
        page_start = 1
        page_end = show_page_num
    elif current_page + half_show_page_num >= total_page:
        page_end = total_page
        page_start = total_page - show_page_num + 1
    else:
        page_start = current_page - half_show_page_num
        page_end = current_page + half_show_page_num

    print("{} -{}- {}".format(page_start, current_page, page_end))
    print("=" * 120)

    # 当前页码应该展示的书籍数据
    book_list = data[(current_page-1)*per_page:current_page*per_page]
    # 生成分页的页码
    """
            <li><a href="#">1</a></li>
            <li><a href="#">2</a></li>
            <li><a href="#">3</a></li>
            <li><a href="#">4</a></li>
            <li><a href="#">5</a></li>
    """
    li_list = []
    # 添加首页
    li_list.append('<li><a href="/book_list/?page=1">首页</a></li>')
    # 添加上一页
    if current_page <= 1:  # 没有上一页
        prev_html = '<li class="disabled"><a aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>'
    else:
        prev_html = '<li><a href="/book_list/?page={}" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>'.format(current_page-1)
    li_list.append(prev_html)
    for i in range(page_start, page_end+1):
        if i == current_page:
            tmp = '<li class="active"><a href="/book_list/?page={0}">{0}</a></li>'.format(i)
        else:
            tmp = '<li><a href="/book_list/?page={0}">{0}</a></li>'.format(i)
        li_list.append(tmp)
    # 添加下一页
    if current_page >= total_page:  # 表示没有下一页
        next_html = '<li class="disabled"><a aria-label="Previous"><span aria-hidden="true">&raquo;</span></a></li>'
    else:
        next_html = '<li><a href="/book_list/?page={}" aria-label="Previous"><span aria-hidden="true">&raquo;</span></a></li>'.format(current_page+1)
    li_list.append(next_html)
    # 添加尾页
    li_list.append('<li><a href="/book_list/?page={}">尾页</a></li>'.format(total_page))

    # 将生成的li标签 拼接成一个大的字符串
    page_html = "".join(li_list)
    # print(page_html)

    # 2. 在页面上展示出来
    return render(request, "book_list.html", {"book_list": book_list, "page_html": page_html})
稳扎稳打版
class Page(object):
    """
    实现Django ORM数据的分页展示
    使用说明:
        from utils import mypage
        page_obj = mypage.Page(total_num, current_page, 'publisher_list')
        publisher_list = data[page_obj.data_start:page_obj.data_end]
        page_html = page_obj.page_html()
        为了显示效果,show_page_num最好使用奇数
    """
    def __init__(self, total_num, current_page, url_prefix, per_page=10, show_page_num=11):
        """

        :param total_num: 数据的总条数
        :param current_page: 当前访问的页码
        :param url_prefix: 分页代码里a标签的前缀
        :param per_page: 每一页显示多少条数据
        :param show_page_num: 页面上最多显示多少个页码
        """
        self.total_num = total_num
        self.url_prefix = url_prefix

        self.per_page = per_page
        self.show_page_num = show_page_num

        # 通过初始化传入的值计算得到的值
        self.half_show_page_num = self.show_page_num // 2
        # 当前数据总共需要多少页码
        total_page, more = divmod(self.total_num, self.per_page)
        # 如果有余数,就把页码数+1
        if more:
            total_page += 1
        self.total_page = total_page
        # 对传进来的当前页码数做有效性校验
        try:
            current_page = int(current_page)
        except Exception as e:
            current_page = 1
        # 如果当前页码数大于总页码数,默认展示最后一页的数据
        # current_page = total_page if current_page > total_page else current_page
        if current_page > self.total_page:
            current_page = self.total_page
        # 如果当前页码数小于1,默认展示第一页的数据
        if current_page < 1:
            current_page = 1

        self.current_page = current_page

        # 求 页面上 需要展示的页码范围
        if self.current_page - self.half_show_page_num <= 1:
            page_start = 1
            page_end = show_page_num
        elif self.current_page + self.half_show_page_num >= self.total_page:
            page_end = self.total_page
            page_start = self.total_page - self.show_page_num + 1
        else:
            page_start = self.current_page - self.half_show_page_num
            page_end = self.current_page + self.half_show_page_num
        self.page_start = page_start
        self.page_end = page_end

    @property
    def data_start(self):
        # 返回当前页应该从哪儿开始切数据
        return (self.current_page-1)*self.per_page

    @property
    def data_end(self):
        # 返回当前页应该切到哪里为止
        return self.current_page*self.per_page

    def page_html(self):
        li_list = []
        # 添加首页
        li_list.append('<li><a href="/{}/?page=1">首页</a></li>'.format(self.url_prefix))
        # 添加上一页
        if self.current_page <= 1:  # 没有上一页
            prev_html = '<li class="disabled"><a aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>'
        else:
            prev_html = '<li><a href="/{}/?page={}" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>'.format(self.url_prefix,
                self.current_page - 1)
        li_list.append(prev_html)
        for i in range(self.page_start, self.page_end + 1):
            if i == self.current_page:
                tmp = '<li class="active"><a href="/{0}/?page={1}">{1}</a></li>'.format(self.url_prefix, i)
            else:
                tmp = '<li><a href="/{0}/?page={1}">{1}</a></li>'.format(self.url_prefix, i)
            li_list.append(tmp)
        # 添加下一页
        if self.current_page >= self.total_page:  # 表示没有下一页
            next_html = '<li class="disabled"><a aria-label="Previous"><span aria-hidden="true">&raquo;</span></a></li>'
        else:
            next_html = '<li><a href="/{}/?page={}" aria-label="Previous"><span aria-hidden="true">&raquo;</span></a></li>'.format(
                self.url_prefix, self.current_page + 1)
        li_list.append(next_html)
        # 添加尾页
        li_list.append('<li><a href="/{}/?page={}">尾页</a></li>'.format(self.url_prefix, self.total_page))

        # 将生成的li标签 拼接成一个大的字符串
        page_html = "".join(li_list)
        return page_html
封装保存版
    page_obj = mypage.Page(total_num, current_page, 'publisher_list', per_page=20)
    publisher_list = data[page_obj.data_start:page_obj.data_end]
    page_html = page_obj.page_html()
    return render(request, "publisher_list.html", {"publisher_list": publisher_list, "page_html": page_html})
封装方法使用

猜你喜欢

转载自www.cnblogs.com/Yang-Sen/p/9225263.html