接着上一篇的基础,做一个分页,前端界面采用bootstrap插件。
把分页的功能封装在pageInfo类中,做成一个组件,不论在任何地方直接导入都是可以用的:
class pageInfo(object):
def __init__(self,current_page,all_count,per_page,show_page,currrnt_url):
"""
:param current_page: 当前访问的页码
:param all_count: 数据库数据总条数
:param per_page: 每一页显示几条数据
:param show_page: 显示的页码个数,--可以自己设置,但是一定要设置不小于3奇数,
如show_page=11,显示当前页前5条和后5条,一共11条页码,
:param currrnt_url:展示数据页面的URL
"""
try:
self.current_page = int(current_page)
except Exception as e:
self.current_page = 1
self.per_page = per_page
#计算总页数
a,b = divmod(all_count,per_page)
if b:
a = a + 1
self.all_page = a
self.show_page = show_page
#接收URL
self.currrnt_url = currrnt_url
def start(self):
#每一页要显示数据的起始位置
return (self.current_page-1) * self.per_page
def end(self):
#每一页要显示数据的结束位置
return self.current_page * self.per_page
def pager(self):
if self.current_page < self.show_page:
#如果当前页小于显示的页数,那么一直让分页显示,第一页到---self.show_page
star = 1
end = self.show_page + 1
elif self.current_page > self.all_page - self.show_page + 1:
#如果当前页大于总页数减去10(self.all_page-10),那么让分页显示:self.all_page-10----self.all_page(总页数)
star = self.all_page - self.show_page + 1
end = self.all_page + 1
else:
#除以上两种情况,分页都显示当前页前5页,后5页
half = int((self.show_page - 1)/2)
star = int(self.current_page - half)
end = int(self.current_page + half +1)
#上一页
if self.current_page <= 1:
up = " » "
else:
up = " « "%(self.currrnt_url,self.current_page-1,)
page_list = []
page_list.append(up)
#分页
for i in range(star,end):
if i == self.current_page:
temp = "%s "%(self.currrnt_url,i,i,)
else:
temp = "%s " % (self.currrnt_url,i, i,)
page_list.append(temp)
#下一页
if self.current_page >= self.all_page:
nt = " « "
else:
nt = " » " % (self.currrnt_url,self.current_page + 1,)
page_list.append(nt)
return ''.join(page_list)
urlpatterns = [
url(r'^custom/', views.custom),#自制分页
]
def custom(request):
# current_page = request.GET.get('page')#当前要访问的页码
# current_page = int(current_page)
all_count = models.UserIfo.objects.all().count()
page_info = pageInfo(request.GET.get('page'),all_count,15,11,'/custom/')
user_list = models.UserIfo.objects.all()[page_info.start():page_info.end()]
return render(request,'custom.html',{
'user_list':user_list,'page_info': page_info})
<html lang="en">
<head>
<meta charset="UTF-8">
<title>USER表title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
head>
<body>
<h3>USER列表h3>
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th>idth>
<th>nameth>
<th>ageth>
<th>ut.titleth>
tr>
thead>
<tbody>
{% for row in user_list %}
<tr>
<td>{
{ row.id }}td>
<td>{
{ row.name }}td>
<td>{
{ row.age}}td>
<td>{
{ row.ut.title}}td>
tr>
{% endfor %}
tbody>
table>
<ul class="pagination">
{
{ page_info.pager|safe }}
ul>
body>
html>
此时数据库中数据较少,显示不出效果,先插入300条数据看看效果:
for i in range(300):
name = "帅男" + str(i)
models.UserIfo.objects.create(name=name,age=18,ut_id=2)
有了这样一个组件还是非常方便的,直接引用传入自己的参数即可:
page_info = pageInfo(request.GET.get('page'),all_count,15,11,'/custom/')
参数说明:
以上每一处都有详细注释,就不做过多总结了,再说一下参数说明
第1个参数:通过get传参获取当前的页码
第2个参数:数据总条数
第3个参数:每一页显示的数据条数
第4个参数:显示页码个数
第5个:URL
nice!!!!奥利给