Django之分页显示

分页:Django-进阶

Django的分页器(paginator)

 分页器的基本使用:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

book_list = [1,2,3,4,5,6,7,8,9,10,11,12,13]

paginator = Paginator(book_list, 5)

print("count:", paginator.count)  # 数据总数
# count: 13

print("num_pages", paginator.num_pages)  # 总页数
# num_pages 3

print("page_range", paginator.page_range)  # 页码的列表
# page_range range(1, 3)

page1 = paginator.page(1)  # 第1页的page对象
for i in page1:  # 遍历第1页的所有数据对象
    print(i)
# 1
# 2
# 3
# 4
# 5

print(page1.object_list)  # 第1页的所有数据
# [1, 2, 3, 4, 5]

page2 = paginator.page(2)

print(page2.has_next())  # 是否有下一页
# True
print(page2.next_page_number())  # 下一页的页码
# 2
print(page2.has_previous())  # 是否有上一页
# False
print(page2.previous_page_number())  # 上一页的页码
# 抛错
#page=paginator.page(12)   # error:EmptyPage
#page=paginator.page("z")   # error:PageNotAnInteger
 

在django里面views视图:

from app01 import models

# 导入Paginator,EmptyPage和PageNotAnInteger模块
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

def log_in(func):
    '''身份认证装饰器,
    :param func:
    :return:
    '''
    def wrapper(request,*args,**kwargs):
        # if not request.session.get("is_login"):
        if not request.user.is_authenticated():
            return redirect("/book/login/")
        return  func(request,*args, **kwargs)
    return wrapper

@log_in  #book_list=log_in(book_list)
def book_list(request):

    #方式一、取出所有书籍
    # bookList=models.Book.objects.all()  #返回值是QuerySet [obj1,obj2 ....]
    # return  render(request, 'index.html',{"bookList":bookList})

    #方式二、取出所有书籍(分页的形式)
    # 获取Book数据表中的所有记录
    book_list = models.Book.objects.all()
    # 生成paginator对象,定义每页显示10条记录
    paginator = Paginator(book_list, 10)
    # 从前端获取当前的页码数,默认为1
    page = request.GET.get('page', 1)
    # 把当前的页码数转换成整数类型
    currentPage = int(page)
    number=int((currentPage-1)*10)  #每个条数据的编号(防止第二页从第一个开始)
    try:
        # print(page)
        book_list = paginator.page(page)  # 获取当前页码的记录
    except PageNotAnInteger:
        book_list = paginator.page(1)  # 如果用户输入的页码不是整数时,显示第1页的内容
    except EmptyPage:
        book_list = paginator.page(paginator.num_pages)  # 如果用户输入的页数不在系统的页码列表中时,显示最后一页的内容
    # return render(request, "index.html",{"bookList":book_list,"paginator":paginator,"currentPage":currentPage})
    return render(request, "text.html",{"bookList":book_list,"paginator":paginator,"currentPage":currentPage,"number":number})

inde页面:

{% extends "template.html" %}  #继承模板
{% block content %}
{#    {{ block.super }}#}
    <div class="row">
            <div class="col-md-12 ">
                <a href="/book/add/"><button class="btn btn-primary">添加书籍</button></a>
                <table class="table table-hover">
                    <tr>
                        <th>编号</th>
                        <th>书名</th>
                        <th>出版日期</th>
                        <th>价格</th>
                        <th>出版社</th>
                        <th>作者</th>
                        <th>操作</th>
                    </tr>

                    {% for book_obj in bookList %}
                        <tr>
                            <td>{{ forloop.counter|add:number}}</td>
                            <td>{{ book_obj.title }}</td>
                            <td>{{ book_obj.pubDate|date:"Y-m-d" }}</td>
                            <td>{{ book_obj.price }}</td>
                            <td>{{ book_obj.publisher.name }}</td>
                            <td>
                                {% for author in book_obj.authors.all  %}
                                        {{ author.name }}
                                {% endfor %}

                            </td>
                            <td>
                                <a href="/book/edit/{{ book_obj.nid }}"><button class="btn btn-info">编辑</button></a>
                                <a href="/book/del/{{ book_obj.nid }}"><button class="btn btn-danger">删除</button></a>
                            </td>
                        </tr>
                    {% endfor %}
                </table>
            </div>
        </div>
{% endblock content %}

扩展其他功能:

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())

 

posted @ 2017-11-29 10:34  ShengLeQi  阅读(986)  评论(0)    收藏  举报