django分页

分页一(简单自定制):

url:http://127.0.0.1:8000/index/?p=1

>>>views.py 
USER_LIST = []
for i in range(1,999):
    temp = {'name':'root'+str(i),'age':i}
    USER_LIST.append(temp)

def index(request):
    per_page_count = 10
    current_page = request.GET.get('p')
    current_page = int(current_page)
    start = (current_page-1)*10
    end = current_page*per_page_count
    data = USER_LIST[start:end]
    if current_page <= 1:
        prev_page = 1
    else:
        prev_page = current_page - 1
    if current_page >= (len(USER_LIST)//per_page_count) + 1:
        next_page = (len(USER_LIST)//per_page_count) + 1
    else:
        next_page = current_page + 1
    return render(request,'index.html',locals())

>>>html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
    {% for row in data %}
        <li>{{ row.name }}-{{ row.age }}</li>
    {% endfor %}
</ul>
<a href="/index/?p={{ prev_page }}">上一页</a>
<a href="/index/?p={{ next_page }}">下一页</a>

</body>
</html>

 分页二(内置模块):

USER_LIST = []
for i in range(1,999):
    temp = {'name':'root'+str(i),'age':i}
    USER_LIST.append(temp)

>>>views
def index1(request):
    from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
    current_page = request.GET.get('p')
    paginator = Paginator(USER_LIST,10)
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象
    try:
        posts = paginator.page(current_page)
        # has_next              是否有下一页
        # next_page_number      下一页页码
        # has_previous          是否有上一页
        # previous_page_number  上一页页码
        # object_list           分页之后的数据列表
        # number                当前页
        # paginator             paginator对象
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)

    return render(request,'index1.html',locals())

>>>html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<ul>
    {% for row in posts.object_list %}
        <li>{{ row.name }}-{{ row.age }}</li>
    {% endfor %}
</ul>

{% if posts.has_previous %}
    <a href="/index1/?p={{ posts.previous_page_number }}">上一页</a>
{% endif %}

{% if posts.has_next %}
    <a href="/index1/?p={{ posts.next_page_number }}">下一页</a>
{% endif %}

<span>
    {{ posts.number }}/{{ posts.paginator.num_pages }}
</span>

</body>
</html>

分页三(内置模块扩展):

>>>views
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
USER_LIST = []
for i in range(1,666):
    temp = {'name':'root'+str(i),'age':i}
    USER_LIST.append(temp)

class CustomPaginator(Paginator):
    def __init__(self,current_page,per_page_num,*args,**kwargs):
        #当前页
        self.current_page = int(current_page)
        #最多显示的页码数量
        self.per_page_num = int(per_page_num)
        super(CustomPaginator,self).__init__(*args,**kwargs)

    def page_num_page(self):
        #数据的总页数<设置显示的页数  就直接显示总的页数
        if self.num_pages <self.per_page_num:
            return range(1,self.num_pages+1)
     #总页数特别多
        part = int(self.per_page_num/2)
        if self.current_page <= part:
            return range(1,self.per_page_num+1)
        if (self.current_page + part) > self.num_pages:
            return range(self.num_pages-self.per_page_num+1,self.num_pages+1)

        return range(self.current_page-part,self.current_page+part+1)

    
def index1(request):

    current_page = request.GET.get('p')
    paginator = CustomPaginator(current_page,7,USER_LIST,10)
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象
    try:
        posts = paginator.page(current_page)
        # has_next              是否有下一页
        # next_page_number      下一页页码
        # has_previous          是否有上一页
        # previous_page_number  上一页页码
        # object_list           分页之后的数据列表
        # number                当前页
        # paginator             paginator对象
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)

    return render(request,'index1.html',locals())

>>>html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<ul>
    {% for row in posts.object_list %}
        <li>{{ row.name }}-{{ row.age }}</li>
    {% endfor %}
</ul>


{% if posts.has_previous %}
    <a href="/index1/?p={{ posts.previous_page_number }}">上一页</a>
{% endif %}

{% for i in posts.paginator.page_num_page %}
{
% if i == posts.number %} <a style="font-size: 30px" href="/index1/?p={{ i }}">{{ i }}</a> {% else %} <a href="/index1/?p={{ i }}">{{ i }}</a> {% endif %} {% endfor %} {% if posts.has_next %} <a href="/index1/?p={{ posts.next_page_number }}">下一页</a> {% endif %} <span> {{ posts.number }}/{{ posts.paginator.num_pages }} </span> </body> </html>

 分页四(复杂自定制):

>>>pager.py

class Pagination(object):
    #可调参数  perpageItemNum=10   每页显示的条数
    #可调参数  maxPageNum=7        每次显示页数
    #可调参数  totalCount=666      数据的总个数
    def __init__(self,currentPage,totalCount=666,perpageItemNum=10,maxPageNum=7):
        #数据总个数 total_count
        # 当前页    current_page
        # 每页显示的条数 perpage_item_num
        # 每次显示页数  max_page_num
        self.total_count = totalCount
        try:
            v = int(currentPage)
            if v <= 0:
                v = 1
            self.current_page = v
        except Exception as e:
            self.current_page = 1
        self.perpage_item_num = perpageItemNum
        self.max_page_num = maxPageNum

    # 当前页面的起始值
    def start(self):
        #当前页数-1 * 显示的条数
        return (self.current_page-1) * self.perpage_item_num

    # 当前页面的终止值
    def end(self):
        # 当前页数 * 显示的条数
        return self.current_page * self.perpage_item_num

    #总的页码数
    @property     #加了之后 可以直接调用self.num_pages 不需要再调用self.num_pages()
    def num_pages(self):
        a,b = divmod(self.total_count,self.perpage_item_num)
        if b == 0:
            return a
        return a+1

    #现实的页面数跳动
    def page_num_page(self):
        # 数据的总页数<设置显示的页数  就直接显示总的页数
        if self.num_pages < self.max_page_num:
            return range(1, self.num_pages + 1)
        part = int(self.max_page_num / 2)
        if self.current_page <= part:
            return range(1, self.max_page_num + 1)
        if (self.current_page + part) > self.num_pages:
            return range(self.num_pages - self.max_page_num + 1, self.num_pages + 1)
        return range(self.current_page - part, self.current_page + part + 1)

    #生成显示页面数字
    def page_str(self):
        page_list =[]
        first = "<li><a href='/index2/?p=1'>首页</a></li>"
        page_list.append(first)

        if self.current_page == 1:
            prev = "<li><a href='#'>上一页</a></li>"
        else:
            prev = "<li><a href='/index2/?p=%s'>上一页</a></li>"%(self.current_page-1)
        page_list.append(prev)

        for i in self.page_num_page():
            if i == self.current_page:
                temp = "<li class='active'><a href='/index2/?p=%s'>%s</a></li>"%(i,i)
            else:
                temp = "<li><a href='/index2/?p=%s'>%s</a></li>" % (i, i)
            page_list.append(temp)

        if self.current_page == self.num_pages:
            nexts = "<li><a href='#'>下一页</a></li>"
        else:
            nexts = "<li><a href='/index2/?p=%s'>下一页</a></li>"%(self.current_page+1)
        page_list.append(nexts)

        last = "<li><a href='/index2/?p=%s'>尾页</a></li>"%self.num_pages
        page_list.append(last)

        return ''.join(page_list)

>>>views
def index2(request):
    from app1.pager import Pagination
    #获取用户点击发过来的请求页面
    current_page = request.GET.get('p')
    page_obj = Pagination(current_page)

    data = USER_LIST[page_obj.start():page_obj.end()]
    return render(request,'index2.html',locals())

>>>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">
</head>
<body>

<ul>
    {% for row in data %}
        <li>{{ row.name }}-{{ row.age }}</li>
    {% endfor %}
</ul>

<ul class="pagination pagination-sm">

        {{ page_obj.page_str|safe }}

      </ul>

</body>
</html>
原文地址:https://www.cnblogs.com/yzcstart/p/10714787.html