分页
前端
<nav aria-label="Page navigation">
<ul class="pagination">
{{ html_str }}
</ul>
</nav>
后端
分页组件
from django.utils.safestring import mark_safe
import copy
class Pagination:
def __init__(self, request, queryset, page_size=5):
self.request = request
self.request_get = copy.deepcopy(request.GET)
self.request_get._mutable = True
self.queryset = queryset
self.page_size = page_size
self.page = self.request.GET.get('page')
if not self.page:
self.page = 1
elif not self.page.isdigit():
self.page = 1
self.page = int(self.page)
if self.page < 1:
self.page = 1
self.page_len, end_count = divmod(self.queryset.count(), self.page_size)
if end_count > 0:
self.page_len += 1
if self.page > self.page_len:
self.page = self.page_len
if self.queryset.count() == 0:
self.start = 0
else:
self.start = (self.page - 1) * self.page_size
self.end = self.page * self.page_size
def html(self):
html_str = ''
start_page = self.page - 5
end_page = self.page + 4
if self.page - 1 < 1:
self.request_get.setlist('page', [1])
else:
self.request_get.setlist('page', [self.page - 1])
up_page = f'<li><a href="?{self.request_get.urlencode()}">上一页</a></li>'
html_str += up_page
self.request_get.setlist('page', [1])
first_page = f'<li><a href="?{self.request_get.urlencode()}">首页</a></li>'
html_str += first_page
for i in range(start_page, end_page):
current_page = i + 1
if current_page < 1 or current_page > self.page_len:
pass
else:
self.request_get.setlist('page', [current_page])
if current_page == self.page:
item_str = f'<li class="active"><a href="?{self.request_get.urlencode()}">{current_page}</a></li>'
else:
item_str = f'<li><a href="?{self.request_get.urlencode()}">{current_page}</a></li>'
html_str += item_str
if self.page_len == 0:
self.request_get.setlist('page', [1])
else:
self.request_get.setlist('page', [self.page_len])
minus_page = f'<li><a href="?{self.request_get.urlencode()}">尾页</a></li>'
html_str += minus_page
if self.page + 1 > self.page_len:
if self.page_len == 0:
self.request_get.setlist('page', [1])
else:
self.request_get.setlist('page', [self.page_len])
else:
self.request_get.setlist('page', [self.page + 1])
down_page = f'<li><a href="?{self.request_get.urlencode()}">下一页</a></li>'
html_str += down_page
explain = f'<li class="disabled"><a href="#">共{self.page_len}页{self.queryset.count()}条数据</a></li>'
html_str += explain
return mark_safe(html_str)
def query_set(self):
return self.queryset[self.start:self.end]
视图层
def user_list(request):
if request.method == 'GET':
queryset = User.objects.filter(isAdmin=0).select_related('level')
pagination = Pagination(request, queryset)
return render(request, 'user/list.html',
{users': pagination.query_set(), 'html_str': pagination.html()})
本文作者:Sherwin
本文链接:https://www.cnblogs.com/sherwin1995/p/16689927.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步