内置分页
效果展示:
views.py
from django.core.paginator import Paginator
def fenye(request):
current_page = request.GET.get('page')
user_list=models.UserInfo.objects.all()
paginator=Paginator(user_list,10)
try:
posts=paginator.get_page(current_page)
except Exception as e:
posts = paginator.get_page(1)
return render(request, 'fenye.html', {'posts': posts})
fenye.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Django内置分页</title>
</head>
<body>
<ul>
{% for user in posts.object_list %}
<li>{{ user.user }}</li>
{% endfor %}
</ul>
<div>
<a href="fenye.html?page=1">INDEX</a>
{% if posts.has_previous %}
<a href="fenye.html?page={{ posts.previous_page_number }}">PREV</a>
{% endif %}
{% for num in posts.paginator.page_range %}
<a href="fenye.html?page={{ num }}"> {{ num }}</a>
{% endfor %}
{% if posts.has_next %}
<a href="fenye.html?page={{ posts.next_page_number }}">NEXT</a>
{% endif %}
<a href="fenye.html?page={{ posts.paginator.num_pages }}">END</a>
</div>
</body>
</html>
自定义分页
最终效果:
page.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义分页</title>
</head>
<body>
<ul>
{% for user in userinfo_list %}
<li>{{ user.user }}</li>
{% endfor %}
{{ page_info.pager|safe }}
</ul>
</body>
</html>
urls.py
from django.urls import path
from app import views
urlpatterns = [
path('index/', views.index),
path('page.html', views.page),
]
views.py
class PageInfo(object):
def __init__(self, current_page, total, per_page,url,show_page=11):
"""
:param current_page:展示页
:param total:总条数
:param per_page:每页显示数
:param url:执行的地址
:param show_page:页码显示数
"""
try:
self.current_page = int(current_page)
except Exception as e:
self.current_page = 1
self.total = total
self.per_page = per_page
self.url = url
self.show_page=show_page
a, b = divmod(total, per_page)
if b:
a += 1
self.all_page = a
def start_page(self):
return (self.current_page - 1) * self.per_page
def end_page(self):
return self.current_page * self.per_page
def pager(self):
page_list = []
half=int((self.show_page-1)/2)
# start_page=1
# end_page=self.all_page+1
if self.all_page<self.show_page:
start_page=1
end_page=self.all_page+1
else:
if self.current_page<=half:
start_page=1
end_page=self.show_page+1
else:
if self.current_page+half>self.all_page:
start_page=self.all_page-self.show_page+1
end_page=self.all_page+1
else:
start_page=self.current_page-half
end_page=self.current_page+half+1
home="<a style='display:inline-block;padding:5px;margin:5px;' href='%s?page=1'>首页</a>"%(self.url)
page_list.append(home)
if self.current_page<=1:
prev="<a style='display:inline-block;padding:5px;margin:5px;' href='#'>上一页</a>"
else:
prev = "<a style='display:inline-block;padding:5px;margin:5px;' href='%s?page=%s'>上一页</a>" % (self.url,self.current_page - 1)
page_list.append(prev)
for i in range(start_page, end_page):
if i == self.current_page:
temp = "<a style='display:inline-block;padding:5px;margin:5px;background-color:blue;' href='%s?page=%s'>%s</a>" % (self.url,i,i)
else:
temp = "<a style='display:inline-block;padding:5px;margin:5px;' href='%s?page=%s'>%s</a>" % (self.url,i,i)
page_list.append(temp)
if self.current_page>=self.all_page:
nex="<a style='display:inline-block;padding:5px;margin:5px;' href='#'>下一页</a>"
else:
nex = "<a style='display:inline-block;padding:5px;margin:5px;' href='%s?page=%s'>下一页</a>" % (self.url,self.current_page +1)
page_list.append(nex)
lst = "<a style='display:inline-block;padding:5px;margin:5px;' href='%s?page=%s'>末页</a>"%(self.url,self.all_page)
page_list.append(lst)
return ''.join(page_list)
def page(request):
# 获取用户访问页
current_page = request.GET.get('page')
# 总条数
total = models.UserInfo.objects.all().count()
page_info = PageInfo(current_page, total,10,'page.html',8)
userinfo_list = models.UserInfo.objects.all()[page_info.start_page(): page_info.end_page()]
return render(request, 'page.html', {'userinfo_list': userinfo_list, 'page_info': page_info})