Django内置分页扩展

1.url文件

#ulr文件
from django.contrib import admin
from django.urls import path

from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index,views.index)
    path('show',views.show)

]

2.views文件

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

# Create your views here.

USER_LIST = [] #定义一个列表,存储数据
for i in range(1,1000):
    user = {"name":"lee"+str(i),"id":i}
    USER_LIST.append(user)


def index(request):
    per_page_count = 10
    current_page=request.GET.get('p')
    current_page=int(current_page)

    start = (current_page - 1)*per_page_count
    end =current_page*per_page_count
    data = USER_LIST[start:end]

    if current_page<=1:
        prve_pag = 1
    prve_pag = current_page -1
    next_pag = current_page +1
    return render(request,'index.html',{"users":data,"prve_page":prve_pag,"next_page":next_pag})


class CustomPaginator(Paginator):  #继承Paginator后,可以不改变原有类的代码,而扩展内置分页
    def __init__(self,current_page,per_page_num,*args,**kwargs):
        super(CustomPaginator,self).__init__(*args,**kwargs)#继承,等价于:Paginator.__init__(self,*args,**kwargs)
        #当前页
        self.current_page = int(current_page)
        #最多显示数量
        self.per_page_num = int(per_page_num)

    def per_num_range(self):
        #如果总页数小于最多显示数量
        if self.num_pages<self.per_page_num:
            return range(1,self.num_pages+1)
        part=int(self.per_page_num/2)

        #当前页小于part(页码从领开始)
        if self.current_page <part:
            return range(1,self.per_page_num+1)
        #当前页+part大于总页数(页码最后一位已经显示出来了)
        if (self.current_page+part)>self.num_pages:
            return range(self.num_pages - self.per_pager_num + 1, self.num_pages + 1)
        return range(self.current_page - part, self.current_page + part + 1)

def show(request):

    # 全部数据:USER_LIST,=》得出共有多少条数据
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象(是否具有下一页;是否有上一页;)
    current_page=request.GET.get('p')
    paginator = CustomPaginator(current_page,7,USER_LIST,10)

    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,"show.html",{"posts":posts})

3.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.id }}</li>
    {% endfor %}
</ul>
    {% include 'include/pager.html' %}  #引入模板
</body>
</html>

4.include引入的模板页可以重复循环使用

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

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


    {% for i in posts.paginator.per_num_range %}
        {% if i == posts.number  %}
            <a style="font-size: 20px;" href="/show.html?p={{ i }}">{{ i }}</a>
        {% else %}
            <a href="/show.html?p={{ i }}">{{ i }}</a>
        {% endif %}
    {% endfor %}



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

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


</body>
</html>

5.效果显示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值