zoukankan      html  css  js  c++  java
  • Django 2.0 学习(19):Django 分页器

    Django 分页器

    要使用Django实现分页功能,必须从Django中导入Paginator模块(painator - 分页器)
    views.py
    from django.shortcuts import render
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    from BookSite.models import *

    def index(request):
    """
    批量导入数据
    book_list = []
    for i in range(100):
    book_list.append(Book(title="book"+str(i), price=30+i**2))
    Book.objects.bulk_create(book_list)
    """

    """
    分页器的使用
    book_list = Book.objects.all()
    paginator = Paginator(book_list, 10)
    print("count:", paginator.count)        # 总数居
    print("num_pages", paginator.num_pages)     # 总页数
    print("page_range", paginator.page_range)   # 页面的列表
    
    page_one = paginator.page(1)        # 第一页的page对象
    for i in range(page_one):           # 遍历第1页的所有数据对象
        print(i)
    print(page_one.object_list)         # 第1页所有数据
    
    page_two = paginator.page(2)
    print(page_two.has_next())                  # 是否有下一页
    print(page_two.next_page_number())          # 下一页的页码
    print(page_two.has_previous())              # 是否有上一页
    print(page_two.previous_page_number())      # 上一页的页码
    
    # 抛出错误
    page = paginator.page(12)               # Error:EmptyPage
    page = paginator.page("z")              # Error:PageNotAnInteger
    """
    
    book_list = Book.objects.all()
    paginator = Paginator(book_list, 10)
    page = request.GET.get("page", 1)
    current_page = int(page)
    
    try:
        print(page)
        book_list = paginator.page(page)
    except PageNotAnInteger:
        book_list = paginator.page(1)
    except EmptyPage:
        book_list = paginator.page(paginator.num_pages)
    
    return render(request, "index.html", {
        "book_list": book_list,
        "paginator": paginator,
        "current_page": current_page
    })
    

    def retrieve(request):
    """
    批量导入
    book_list = []
    for i in range(100):
    book_list.append(models.Book(title="book"+str(i), price=20+i*i))
    models.Book.objects.bulk_create(book_list)
    """

    book_list = Book.objects.all()              # book_list打印的是一个对象 查询所有的书
    paginator = Paginator(book_list, 5)            # 这里的book_list必须是一个集合对象,把所有的书分页,每页5个
    print(paginator.page_range)                 # range(1, 4)
    amount = request.GET.get("page", 2)         # 得到页数范围 默认有1页
    print(amount, type(amount))
    book_list = paginator.page(amount)          # 显示第1页的内容
    return render(request, "retrieve.html", {
        "book_list": book_list,
        "page_range": paginator.page_range,
        "amount": int(amount),
        "paginator": paginator
    })
    
    
    **index.html**
    
    ```html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" 
        integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    </head>
    <body>
    
    <div class="container">
    
        <h4>分页器</h4>
        <ul>
    
            {% for book in book_list %}
                 <li>{{ book.title }} -----{{ book.price }}</li>
            {% endfor %}
    
         </ul>
    
    
        <ul class="pagination" id="pager">
    
                     {% if book_list.has_previous %}
                        <li class="previous"><a href="/index/?page={{ book_list.previous_page_number }}">上一页</a></li>
                     {% else %}
                        <li class="previous disabled"><a href="#">上一页</a></li>
                     {% endif %}
    
    
                     {% for num in paginator.page_range %}
    
                         {% if num == currentPage %}
                           <li class="item active"><a href="/index/?page={{ num }}">{{ num }}</a></li>
                         {% else %}
                           <li class="item"><a href="/index/?page={{ num }}">{{ num }}</a></li>
    
                         {% endif %}
                     {% endfor %}
    
    
    
                     {% if book_list.has_next %}
                        <li class="next"><a href="/index/?page={{ book_list.next_page_number }}">下一页</a></li>
                     {% else %}
                        <li class="next disabled"><a href="#">下一页</a></li>
                     {% endif %}
    
                </ul>
    </div>
    
    
    
    </body>
    </html>
    

    分页器扩展(views.py)

    def index(request):
    
    
        book_list=Book.objects.all()
    
        paginator = Paginator(book_list, 15)
        page = request.GET.get('page',1)
        currentPage=int(page)
    
        #  如果页数十分多时,换另外一种显示方式
        if paginator.num_pages>30:
    
            if currentPage-5<1:
                pageRange=range(1,11)
            elif currentPage+5>paginator.num_pages:
                pageRange=range(currentPage-5,paginator.num_pages+1)
    
            else:
                pageRange=range(currentPage-5,currentPage+5)
    
        else:
            pageRange=paginator.page_range
    
    
        try:
            print(page)
            book_list = paginator.page(page)
        except PageNotAnInteger:
            book_list = paginator.page(1)
        except EmptyPage:
            book_list = paginator.page(paginator.num_pages)
    
    
        return render(request,"index.html",locals())
    

    分页组件

    1.分页的实现与使用

    class Pagination(object):
        """自定义分页"""
        def __init__(self, current_page, total_count, base_url, params, pre_page_count=10, max_page_count=11):
            try:
                current_page = int(current_page)
            except Exception as e:
                current_page = 1
            if current_page <= 0:
                self.current_page = 1
    
            self.current_page = current_page
            self.total_count = total_count      # 数据总条数
            self.pre_page_count = pre_page_count        # 每页显示10条数据
            max_page_num, div = divmod(total_count, pre_page_count)       # 页面上因该显示的最大页码
            if div:
                max_page_num += 1
            self.max_page_num = max_page_num
    
            self.max_page_count = max_page_count        # 页面上默认显示11个页码(当前页在中间)
            self.half_max_page_count = int((max_page_count-1)/2)
            self.base_url = base_url        # URL前缀
    
            import copy
            params = copy.deepcopy(params)      # request.GET
            params._mutable = True
            # 包含当前列表页面所有的搜索条件
            # {source: [2, ], status: [2, ], gender: [2, ], consultant: [1, ], page: [2, ]}
            # self.params[page] = 8
            # self.params.urlencode()
            # source=2&status=2&gender=2&consultant=1&page=8
            # href = "/hosts/?source=2&status=2&gender=2&consultant=1&page=8"
            # href = "%s?%s" % (self.base_url, self.params.urlencode())
            self.params = params
    
        @property
        def start(self):
            render(self.current_page-1) * self.pre_page_count
    
        @property
        def end(self):
            return self.current_page * self.pre_page_count
    
        def page_html(self):
            # 如果总页数小于等于11
            if self.max_page_num <= self.max_page_count:
                page_start = 1
                page_end = self.max_page_num
            else:       # 如果总页数大于11
                # 如果当前页小于等于5
                if self.current_page <= self.half_max_page_count:
                    page_start = 1
                    page_end = self.max_page_count
                else:       # 如果当前页+5大于总页码
                    if (self.current_page + self.half_max_page_count) > self.max_page_num:
                        page_end = self.max_page_num
                        page_start = self.max_page_num - self.max_page_count+1      # 倒着数11个
                    else:
                        page_start = self.current_page - self.half_max_page_count
                        page_end = self.current_page - self.half_max_page_count
            page_list = []
            # {source:[2,], status:[2], gender:[2],consultant:[1],page:[1]}
            # 首页
            self.params["page"] = 1
            first_page = '<li><a href="%s?%s">首页</a></li>' % (self.base_url, self.params.urlencode(),)
            page_list.append(first_page)
    
            # 上一页
            self.params["page"] = self.current_page-1
            if self.params["page"] < 1:
                previous_page = '<li class="disabled"><a href="%s?%s" aria-label="Previous">上一页</span></a></li>' %
                (self.base_url, self.params.urlencode())
            else:
                previous_page = '<li><a href = "%s?%s" aria-label = "Previous" >上一页</span></a></li>' % (
                self.base_url, self.params.urlencode())
            page_list.append(previous_page)
    
            # 中间页码
            for i in range(page_start, page_end + 1):
                self.params['page'] = i
                if i == self.current_page:
                    temp = '<li class="active"><a href="%s?%s">%s</a></li>' % (self.base_url, self.params.urlencode(), i,)
                else:
                    temp = '<li><a href="%s?%s">%s</a></li>' % (self.base_url, self.params.urlencode(), i,)
                page_list.append(temp)
    
                # 下一页
            self.params["page"] = self.current_page + 1
            if self.params["page"] > self.max_page_num:
                self.params["page"] = self.current_page
                next_page = '<li class="disabled"><a href = "%s?%s" aria-label = "Next">下一页</span></a></li >' % (
                    self.base_url, self.params.urlencode())
            else:
                next_page = '<li><a href = "%s?%s" aria-label = "Next">下一页</span></a></li>' % (
                    self.base_url, self.params.urlencode())
            page_list.append(next_page)
    
            # 尾页
            self.params['page'] = self.max_page_num
            last_page = '<li><a href="%s?%s">尾页</a></li>' % (self.base_url, self.params.urlencode(),)
            page_list.append(last_page)
    
            return ''.join(page_list)
    

    2.使用

    # 自定义分页组件的使用方法:
       pager_obj = Pagination(request.GET.get('page',1), len(HOST_LIST), request.path_info,request.GET)
       host_list = HOST_LIST[pager_obj.start:pager_obj.end]
       html = pager_obj.page_html()
       return render(request, 'hosts.html', {'host_list':host_list,"page_html":html})
    
  • 相关阅读:
    JSON连载java目的
    2014百度之星预赛(第二场)——Best Financing
    推断值的数组
    Codeforces 437E The Child and Polygon(间隔DP)
    ruby简单的基本 3
    定义和实现二叉树
    C++11并行编程-条件变量(condition_variable)详细说明
    【Bootstrap】自己主动去适应PC、平面、手机Bootstrap网格系统
    使用代码自定义UIView注意一二三
    关于 android 中 postDelayed方法的讲解
  • 原文地址:https://www.cnblogs.com/love9527/p/9239309.html
Copyright © 2011-2022 走看看