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.效果显示