Django 分页器pagintor的使用

# Django 分页器的使用pagintor #

>在视图文件下views.py
    
  

   from django.shortcuts import render, HttpResponse 
    
    from slyajax.models import *  
    
    from django.core.paginator import Paginator, EmptyPage     #调用Paginator方法

    def pags(request):
        goods_list = Goods.objects.all()   #得到QUERYSET列表。
        paginator = Paginator(goods_list, 4)  #使用Paginator方法得到paginator对象
        
        ###### paginator对象的方法 #########
        #print(paginator.count)         #显示所有数据条数
        #print(paginator.page_range)    #分页器的页数范围
        #print(paginator.num_pages)     #分液器总页数
    
        current_page_num = int(request.GET.get('page', 1))   #获得请求的页数,默认值为1,当GET没有值时显示第一页的内容。
        #以下是页面显示效果:,当页数大于11页数时,将显示当前页的前5页和后5页的页码,如果选择的页码小于5时,显示的页码为1至11页,如果页码加5大于最大页码数时,显示最后11页的页码。    如果总页数小于11页时就正常显示页码。    
        if paginator.num_pages > 11:
            if current_page_num-5 < 1:  #当前页-5如果小于1的话,说明页码已经是小于5的,那么页码范围就显示前11页数。
                                        #这里也可以写成 if current_page_num < 6 。这样显得更容易理解。
                current_range = range(1, 11)
            elif current_page_num+5 > paginator.num_pages:    #当前页码+5大于最大页码时,说明已经到达最后的5页了。那么页码范围就显示后11页数。
                                        #这里也可以写成 elif current_page_num > paginator.num_pages-5 。容易理解。
                current_range = range(paginator.num_pages-10, paginator.num_pages+1)
            else:
                current_range = range(current_page_num-5, current_page_num+6)  #显示当前页的前五和后五页码数。
        else:
            current_range = paginator.page_range   #否则正常显示页码数。
        try:
            current_page = paginator.page(current_page_num)    #当页码超出范围时,会抛出异常。
            # page1 = paginator.page(1)
            # print(page1.object_list)
            # for i in page1:
            #     print(i)
        except EmptyPage as e:    #异常的解决方案为当前页码内容显示为第一页。
           
            current_page = paginator.page(1)
    
    
        return render(request, 'pags.html', locals())
    
    
    ####批量对数据库添加数据####
        # goods_list = []
        # for i in range(100):
        #     goods = Goods(name='goods%s'%i, price=i*i)
        #     goods_list.append(goods)
        # Goods.objects.bulk_create(goods_list)
  ####HTML页面的代码为####
    <body>
    <ul>
        {% for goods in current_page %}
            <li>{{ goods.name }} | {{ goods.price }}</li>
        {% endfor %}
    </ul>
    <nav aria-label="Page navigation">
        <ul class="pagination">
            ##这里是当页面达到最前页时,向上按钮不可用disabled。这里使用has_previous来获取当前页是否有前页(返回值为布尔型),使用previous_page_number来获取前一页的的页码数。###
            {% if current_page.has_previous %}
                <li><a href="?page={{ current_page.previous_page_number }}" aria-label="Previous"><span
                        aria-hidden="true">上一页</span></a></li>
                {% else %}
                <li class="disabled"><a href="" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
            ##当没有前一页时,上一页的标签显示不可用。
            {% endif %}
    
    
            {% for page_nums in current_range %}  #获得页码数的显示范围
                {% if current_page_num == page_nums %}   #当前显示页面的页码设置为active。
                    <li class="active"><a href="?page={{ page_nums }}">{{ page_nums }}</a></li>
                {% else %}
                    <li><a href="?page={{ page_nums }}">{{ page_nums }}</a></li>
                {% endif %}
    
            {% endfor %}
            #这里是下一页按钮的设置,使用has_next来获得是否有下一页,用next_page_number来获取下一页的页码数。
            {% if current_page.has_next %}
                <li><a href="?page={{ current_page.next_page_number }}" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
            {% else %}
                <li class="disabled"><a href="" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
            {% endif %}
    
        </ul>
    </nav>
    </body>

  

posted @ 2018-12-15 21:03  sly27  阅读(635)  评论(0编辑  收藏  举报