Django笔记–自制分页
前言
接着上一篇的基础,做一个分页,前端界面采用bootstrap插件。
一、封装pageInfo类
把分页的功能封装在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 = " <li ><a href='#'>»</a></li>"
else:
up = " <li ><a href='%s?page=%s'>«</a></li>"%(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 = "<li class='active'><a href='%s?page=%s'>%s</a></li>"%(self.currrnt_url,i,i,)
else:
temp = "<li ><a href='%s?page=%s'>%s</a></li>" % (self.currrnt_url,i, i,)
page_list.append(temp)
#下一页
if self.current_page >= self.all_page:
nt = " <li ><a href='#'>«</a></li>"
else:
nt = " <li ><a href='%s?page=%s'>»</a></li>" % (self.currrnt_url,self.current_page + 1,)
page_list.append(nt)
return ''.join(page_list)
二、使用步骤
1.配置路由
urlpatterns = [
url(r'^custom/', views.custom),#自制分页
]
2.编写视图函数
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})
3.HTML模板渲染
<!DOCTYPE html>
<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>id</th>
<th>name</th>
<th>age</th>
<th>ut.title</th>
</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!!!!奥利给