1.普通分页
.py
from django.shortcuts import render
# Create your views here.
user_list = []
for i in range(1, 1000):
user = {'name': 'user' + str(i), 'age': 'age' + str(i)}
user_list.append(user)
def index(request):
page_count = 10
current_page = request.GET.get('p')
current_page = int(current_page)
start = (current_page - 1) * page_count
end = current_page * page_count
user_list_onepage = user_list[start:end]
pre_page = current_page - 1
next_page = current_page + 1
return render(request, 'index.html',
{'user_list_onepage': user_list_onepage, 'pre_page': pre_page, 'next_page': next_page})
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
{% for item in user_list_onepage %}
<li>{{ item.name }}--{{ item.age }}</li>
{% endfor %}
</ul>
<a href="/index?p={{ pre_page }}">上一页</a>
<a href="/index?p={{ next_page }}">下一页</a>
</body>
</html>
2.django内置分页
.py
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', {'posts': posts})
index1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
{% for item in posts.object_list %}
<li>{{ item.name }}--{{ item.age }}</li>
{% endfor %}
</ul>
{% if posts.has_previous %}
<a href="/index1?p={{ posts.previous_page_number }}">上一页</a>
{% else %}
<a href="#">上一页</a>
3.django内置分页扩展
views.py
# django 分页自定制
class CustomPaginator(Paginator):
def __init__(self,current_page,per_page_num,*args,**kwargs):
super(CustomPaginator,self).__init__(*args,**kwargs)
self.current_page=int(current_page)
self.per_page_num=int(per_page_num)
def pager_num_range(self):
part=int(self.per_page_num/2)
#总页数少于per_pager_num
if self.num_pages<=self.per_page_num:
return range(1,self.num_pages+1)
# 当前页数少于per_pager_num的一半
if self.current_page<=part:
return range(1,self.per_page_num+1)
# 当前页数+per_pager_num的一半大于总页面数
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+1,self.current_page+part+1)
def index2(request):
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
current_page = request.GET.get('p')
paginator = CustomPaginator(current_page,10,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, 'index2.html', {'posts': posts})
4.自定制万能分页框架
pager.py
class Paginator(object):
def __init__(self,total_count,current_page_num,per_page_num=30,max_page_num=10):
#数据总个数
self.total_count=int(total_count)
#当前页数
try:
self.current_page_num=int(current_page_num)
except Exception as e:
self.current_page_num = 1
#每一页数据个数
self.per_page_num=int(per_page_num)
#页码数
self.max_page_num=int(max_page_num)
#上一页
self.previous_page_num
=int(current_page_num)-1
#下一页
self.next_page_num = int(current_page_num) + 1
def start(self):
return (self.current_page_num-1) * self.per_page_num
def end(self):
return self.current_page_num * self.per_page_num
#总页数
@property
def total_pager_num(self):
a,b=divmod(self.total_count,self.per_page_num)
if b==0:
return a
return a+1
#页码
def pager_num_range(self):
part=int( self.max_page_num/2)
#总页数少于max_page_num
if self.total_pager_num<=self.max_page_num:
return range(1,self.total_pager_num+1)
# 当前页数少于per_pager_num的一半
if self.current_page_num<=part:
return range(1,self.max_page_num+1)
# 当前页数+per_pager_num的一半大于总页面数
if (self.current_page_num+part)>self.total_pager_num:
return range(self.total_pager_num-self.max_page_num+1 , self.total_pager_num+1)
#一般情况
return range(self.current_page_num-part+1,self.current_page_num+part+1)
#是否有上一页
@property
def has_previous(self):
if self.current_page_num>1:
return True
# 是否有下一页
@property
def has_next(self):
if self.current_page_num < self.total_pager_num :
return True
def page_str(self):
str_list=[]
first_page_str = '<a href = "/index3?p=1" > 首页 </a>'
str_list.append(first_page_str)
if self.has_previous:
pre_page_str='<a href = "/index3?p=%s" > 上一页 </a>'%self.previous_page_num
else:
pre_page_str = '<a href = "/index3?p=1" > 上一页 </a>'
str_list.append(pre_page_str)
for item in self.pager_num_range():
if item == self.current_page_num :
temp='<a style = "color: red" href = "/index3?p=%s" > %s </a>'%(item,item)
else :
temp = '<a href = "/index3?p=%s" > %s </a>' % (item, item)
str_list.append(temp)
if self.has_next:
next_page_str='<a href = "/index3?p=%s" > 下一页 </a>'%self.next_page_num
else:
next_page_str = '<a href = "/index3?p=%s" > 下一页 </a>' % self.total_pager_num
str_list.append(next_page_str)
current_total_str='<span> %s/%s </span>'%(self.current_page_num,self.total_pager_num)
str_list.append(current_total_str)
last_page_str = '<a href = "/index3?p=%s" > 尾页 </a>'%self.total_pager_num
str_list.append(last_page_str)
return ''.join(str_list)
view.py
user_list = []
for i in range(1, 666):
user = {'name': 'user' + str(i), 'age': 'age' + str(i)}
user_list.append(user)
def index3(request):
current_page=request.GET.get('p')
obj=Paginator(666,current_page)
data_list=user_list[obj.start():obj.end()]
return render(request, 'index3.html', {'data': data_list,'obj':obj})
index3.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
{% for item in data %}
<li>{{ item.name }}--{{ item.age }}</li>
{% endfor %}
</ul>
{{ obj.page_str|safe }}
</body>
</html>