首页 > 技术文章 > Djang内置分页和自定义分页

liujinmeng 2021-06-16 11:20 原文

内置分页

views

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

def DJs_pages(request):
    nid=request.GET.get('nid')
    user_list=models.UserInfo.objects.all()
    paginator=Paginator(user_list,2)
    # .per_page: 每页显示条目数量
    # .count:    数据总个数
    # .num_pages:总页数
    # .page_range:总页数的索引范围,如: (1,10),(1,200) 一次性显现有多少页显示多少个页码
    # .page:     page对象
    if nid:
        a=paginator.page(nid)  #显示第x页  a相当于一个列表里面是一页的内容
    else:
        a=paginator.page(1)

    # has_next              是否有下一页
    # next_page_number      下一页页码
    # has_previous          是否有上一页
    # previous_page_number  上一页页码
    # object_list           分页之后的数据列表
    # number                当前页
    # paginator             paginator对象
    return render(request,'pages.html',{'a':a})
View Code

template

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <h1>用户列表</h1>
 9    <ul>
10       {%for row in a %}
11           <li>{{row.nid}}==={{row.user}}==={{row.age}}===={{row.ug.title}}</li>
12         {%endfor%}
13 
14    </ul>
15 <div>
16      {%if a.has_next %}
17          <a href="/pages/?nid={{a.next_page_number}}">下一页</a>
18      {%endif%}
19 
20     </div>
21 <div>
22         {%for row in a.paginator.page_range %}
23           <a href="/pages/?nid={{row}}">{{row}}</a>
24         {%endfor%}
25 
26     </div>
27 </body>
28 </html>
View Code

自定义分页

views

 1 from creat_tool.paging import PageInfo
 2 
 3 def custom_page(request):
 4 
 5     all_num=models.UserInfo.objects.all().count()
 6     #page_num=math.ceil(all_num/3)
 7     pageinfo=PageInfo(request.GET.get('page'),1,all_num,2,'/custom/')  #(current_page,每页几个数据,一共多少数据,显示几个页码,url)
 8     #current_page=request.GET.get('page')
 9     #每页显示多少数据
10     #current_page=int(current_page)
11     #per_page=3
12     #0-3 3-6  6-9
13     user_list = models.UserInfo.objects.all()[pageinfo.start():pageinfo.end()]#[起始位置:结束位置]
14     return render(request, 'custom.html', {'user_list': user_list,'pageinfo':pageinfo})

class

import math
class PageInfo():
    def __init__(self,curret_page,per_page_ha_num,all_num,show_page,base_url):
        try:
            self.curret_page=int(curret_page)  #1.将str数字转换为数字  2.不是数字的报错执行except
        except Exception as e:
            self.curret_page=1
        self.per_page_ha_num=per_page_ha_num
        self.all_num=all_num
        self.all_page_num=math.ceil(self.all_num / self.per_page_ha_num)
        self.show_page=int(show_page/2)
        self.base_url=base_url
    def start(self):
        return (self.curret_page-1)*self.per_page_ha_num
    def end(self):
        return self.curret_page*self.per_page_ha_num

    def pagers(self):
        star = self.curret_page - self.show_page

        end = self.curret_page + self.show_page

        if star <= 0:
            star = 1
        if end > self.all_page_num:
            end = self.all_page_num

        page_list = []
        if self.curret_page <= 1:
            # prev = '<a href="">上一页</a>'
            prev = '<li><a href="#" aria-label="Previous"><span aria-hidden="true">&laquo;</span>上一页</a></li>'

        else:
            # prev = '<a href="%s?page=%s">上一页</a>' %(self.base_url,self.curret_page-1)
            prev = '<li><a href="%s?page=%s" aria-label="Previous"><span aria-hidden="true">&laquo;</span>上一页</a></li>' % (
            self.base_url, self.curret_page - 1)

        page_list.append(prev)

        # for i in range(1,self.all_page_num+1):
        for i in range(star, end + 1):
            if i == self.curret_page:
                # temp='<a style="background-color:pink" href="%s?page=%s">%s</a>' %(self.base_url,i,i)
                temp = ' <li class="active" ><a href="%s?page=%s">%s</a></li>' % (
                self.base_url, i, i)  # <li class="active" > 强调当前页
            else:
                temp = ' <li><a href="%s?page=%s">%s</a></li>' % (self.base_url, i, i)
                # temp = '<a href="%s?page=%s">%s</a>' % (self.base_url,i, i)
            page_list.append(temp)

        if self.curret_page >= self.all_page_num:
            # prev = '<a href=""> 下一页</a>'
            prev = '<li><a href="#" aria-label="Next"><span aria-hidden="true">&laquo;</span></a></li>'
            prev = ' <li><a href="#" aria-label="Next"><span aria-hidden="true">&raquo;</span>下一页</a></li>'
        else:
            # prev = '<a href="%s?page=%s">下一页</a>' % (self.base_url,self.curret_page + 1)
            prev = '<li><a href="%s?page=%s" aria-label="Next"><span aria-hidden="true">&raquo;</span>下一页</a></li>' % (
            self.base_url, self.curret_page + 1)
        page_list.append(prev)
        return ''.join(page_list)
View Code

template

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
     <link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.css">

</head>
<body>

<h1>用户列表</h1>
   <ul>
      {%for row in user_list %}
          <li>{{row.nid}}==={{row.user}}==={{row.age}}===={{row.ug.title}}</li>
        {%endfor%}

   </ul>
<!--   {{pageinfo.pagers|safe}}-->
<!--   传类的对象过来,调用的方法就自动显示-->


<nav aria-label="Page navigation">
  <ul class="pagination">

      {{pageinfo.pagers|safe}}

  </ul>
</nav>

</body>
</html>
View Code

 

推荐阅读