分页是网站中常见的功能,用于将数据拆分成多页显示。以下是实现分页的详细步骤及示例代码。
设定每页显示数据条数
用户输入页码
计算起始位置
查询数据库
生成分页导航
[上一页][1][2][3][4][5][下一页]
。python#!/usr/bin/env python
# -*- coding:utf-8 -*-
from django.utils.safestring import mark_safe
class PageInfo(object):
def __init__(self, current, totalItem, peritems=5):
"""
:param current: 当前页码
:param totalItem: 数据总条数
:param peritems: 每页显示条数(默认 5 条)
"""
self.__current = current
self.__peritems = peritems
self.__totalItem = totalItem
# 获取数据表中的起始位置
def From(self):
return (self.__current - 1) * self.__peritems
# 获取数据表中的结束位置
def To(self):
return self.__current * self.__peritems
# 计算总页数
def TotalPage(self):
result = divmod(self.__totalItem, self.__peritems)
if result[1] == 0:
return result[0]
else:
return result[0] + 1
pythondef Custompager(baseurl, currentPage, totalpage):
perPager = 11 # 设置每页显示 11 个页码按钮
begin = 0
end = 0
# 如果总页数小于 11,显示全部页码
if totalpage <= 11:
begin = 0
end = totalpage
else:
# 当前页大于 5,显示以当前页为中心的分页
if currentPage > 5:
begin = currentPage - 5
end = currentPage + 5
if end > totalpage:
end = totalpage
else:
begin = 0
end = 11
pager_list = []
# 首页按钮
if currentPage <= 1:
first = "<a href=''>首页</a>"
else:
first = "<a href='%s%d'>首页</a>" % (baseurl, 1)
pager_list.append(first)
# 上一页按钮
if currentPage <= 1:
prev = "<a href=''>上一页</a>"
else:
prev = "<a href='%s%d'>上一页</a>" % (baseurl, currentPage - 1)
pager_list.append(prev)
# 中间页码按钮
for i in range(begin + 1, end + 1):
if i == currentPage:
temp = "<a href='%s%d' class='selected'>%d</a>" % (baseurl, i, i)
else:
temp = "<a href='%s%d'>%d</a>" % (baseurl, i, i)
pager_list.append(temp)
# 下一页按钮
if currentPage >= totalpage:
next = "<a href='#'>下一页</a>"
else:
next = "<a href='%s%d'>下一页</a>" % (baseurl, currentPage + 1)
pager_list.append(next)
# 末页按钮
if currentPage >= totalpage:
last = "<a href=''>末页</a>"
else:
last = "<a href='%s%d'>末页</a>" % (baseurl, totalpage)
pager_list.append(last)
# 将分页按钮拼接成 HTML 代码
result = ''.join(pager_list)
return mark_safe(result) # 将字符串标记为安全的 HTML
pythonfrom django.shortcuts import render
from .models import MyModel
from .pagination import PageInfo, Custompager
def my_view(request):
current_page = int(request.GET.get('page', 1)) # 获取当前页码,默认为第一页
total_items = MyModel.objects.count() # 获取数据总条数
page_info = PageInfo(current_page, total_items, peritems=5) # 实例化分页对象
# 查询当前页的数据
data_list = MyModel.objects.all()[page_info.From():page_info.To()]
# 生成分页 HTML
pager = Custompager('/myview/?page=', current_page, page_info.TotalPage())
return render(request, 'my_template.html', {'data_list': data_list, 'pager': pager})
在模板中输出分页导航条:
html<div>
{% for item in data_list %}
<!-- 显示数据 -->
<p>{{ item.name }}</p>
{% endfor %}
</div>
<div class="pagination">
{{ pager }}
</div>
PageInfo
类负责计算数据的起始和结束位置以及总页数。Custompager
函数生成分页按钮的 HTML 代码,并在页面上渲染。这种方式可以灵活控制分页展示方式,满足分页功能的需求,如显示页码范围、上一页/下一页、首页/末页按钮等。
本文作者:GYC
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!