【银角大王——Django课程——分页组件的封装源代码+使用说明】
"""
此组件有一个小bug,
处理:分页的时候,保留原来的搜索条件。
http://127.0.0.1:8000/pretty/list/?q=181
http://127.0.0.1:8000/pretty/list/?page=1
http://127.0.0.1:8000/pretty/list/?q=181&page=3
以后如果想要使用这个分页组件,要需要做如下几件事情
在视图函数中需要做的事情
def pretty_list(request):
#从数据库拿数据
#(1)根据自己的需求情况去筛选数据
queryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")
queryset = models.PrettyNum.objects.all()
#分页组件类实例
#(2)去实例化对象
page_object=Pagination(request,queryset)
#(3)将数据传递到前端
context = {
"queryset": page_object.page_queryset, #分完页的数据
"page_string":page_object.html() #生成的页码
}
return render(request,'pretty_list.html',context)
在HTML中使用:
(1)使用for循环queryset
{% for obj in queryset %}
<tr>
<td>{{obj.id}}</td>
<td>{{obj.mobile}}</td>
<td>{{obj.price}}</td>
<!-- 显示choices-->
<td>{{obj.get_level_display}}</td>
<td>{{obj.get_status_display}}</td>
<td>
<!-- Django框架中传递参数的正则表达式-->
<a class="btn btn-primary btn-xs" href="/pretty/{{obj.id}}/edit/">编辑</a>
<!-- 通过get请求传递参数跳转页面-->
<a class="btn btn-danger btn-xs" href="/pretty/{{obj.id}}/delete/" >删除</a>
</td>
</tr>
{% endfor %}
(2)传递page_string分页组件数据到前端
<ul class="pagination" style="float:left;">
{{page_string}}
</ul>
"""
from django.utils.safestring import mark_safe
class Pagination(object):
def __init__(self,request,queryset,page_size=10,page_param="page",plus = 5):
"""
self,request, 请求的对象
queryset, 查询符合条件的数据(根据这个数据给她进行分页处理)
page_size=10, 每页显示多少条数据
page_param="page", 在url中获取传递分页的参数 例如:pretty/list/?page=2
plus = 5 根据当前页码,显示当前页的前5页和后五页
"""
import copy
query_dict=copy.deepcopy(request.GET)
query_dict.mutable=True
self.query_dict=query_dict
self.page_param=page_param
page = request.GET.get(page_param, "1")
if page.isdecimal():
page=int(page)
else:
page=1
self.page=page
self.page_size=page_size
self.start=(page-1)*page_size
self.end=page*page_size
self.page_queryset=queryset[self.start:self.end]
total_count=queryset.count()
total_page_count, div = divmod(total_count, page_size)
if div:
total_page_count += 1
self.total_page_count=total_page_count
self.plus=plus
def html(self):
if self.total_page_count <= 2 * self.plus + 1:
start_page = 1
end_page = self.total_page_count
else:
if self.page <= self.plus:
start_page = 1
end_page = 2 * self.plus + 1
else:
if (self.page + self.plus) >= self.total_page_count:
start_page = self.total_page_count - 2 * self.plus
end_page = self.total_page_count
else:
start_page = self.page - self.plus
end_page = self.page + self.plus
page_str_list = []
self.query_dict.setlist(self.page_param,[1])
page_str_list.append('<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode()))
if self.page > 1:
self.query_dict.setlist(self.page_param, [self.page - 1])
pre_page = '<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode())
else:
self.query_dict.setlist(self.page_param, [1])
pre_page = '<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode())
page_str_list.append(pre_page)
for i in range(start_page, end_page + 1):
self.query_dict.setlist(self.page_param, [i])
if i == self.page:
ele = '<li class="active"><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
else:
ele = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
page_str_list.append(ele)
if self.page < self.total_page_count:
self.query_dict.setlist(self.page_param, [self.page + 1])
next_page = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode())
else:
self.query_dict.setlist(self.page_param, [self.total_page_count])
next_page = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode())
page_str_list.append(next_page)
self.query_dict.setlist(self.page_param, [self.total_page_count])
page_str_list.append('<li><a href="?{}">尾页</a></li>'.format(self.query_dict.urlencode()))
search_string = """
<li>
<form style="float:left; margin-left:-1px" method="get" >
<div class="input-group" style="width: 80px">
<input style="position:relative; float:left;display:inline-block;border-radius:0; height:33px" type="text" name="page" class="form-comtrol" placeholder="页码">
<span class="input-group-btn">
<button style="border-radius:0" class="btn btn-default" type="submit">跳转</button>
</span>
</div>
</form>
</li>
"""
page_str_list.append(search_string)
page_string = mark_safe("".join(page_str_list))
return page_string