1.views.py
from app01 import pager def custom(request): #当前页码: current_page = request.GET.get('page') # 数据库总行数 all_count = models.UserInfo2.objects.all().count() #实例化对象,参数:当前页码,数据库总行数,每页显示10行,url,每页显示11个页码 page_info = pager.Pager(current_page,all_count,10,'/custom.html',11) #每页显示的用户列表 user_list = models.UserInfo2.objects.all()[page_info.start():page_info.end()] #获取 上一页 页码 下一页 的字符串类型的所有li a标签 page_str = page_info.pager() return render(request, 'custom.html', {'user_list':user_list, 'page_str':page_str})
2.custom.html <body> <h1>用户列表</h1> <ul> {% for row in user_list %} <li>{{ row.name }}</li> {% endfor %} </ul> <!--boorstrap分页--> <!--上 开始--> <nav aria-label="Page navigation"> <ul class="pagination"> <!--上 结束--> <!--|safe是告诉浏览器是安全的,否则浏览器会认为是xss攻击,无法显示正确样式--> {{ page_str|safe}} <!--下 开始--> </ul> </nav> <!--下 结束--> </body>
3.urls.py from app01 import views urlpatterns = [ url('custom.html', views.custom), ]
4.自定义的pager模块,里面有Pager类
class Pager(object): def __init__(self, current_page, all_count, per_page, base_url, show_page): """ current_page:当前页码 all_count: 数据库总行数 per_page: 每页显示多少条数据,或者说多少行 base_url:用户输入的url show_page:每页总共显示多少个页码 """ # 尝试执行,判断当前页码是不是字符串类型的数字,如果是,就强转为数字类型, # 然后增加属性 try: self.current_page = int(current_page) # 如果不是,有可能是字符串,当前页码就直接跳转到第一页 except Exception as e: self.current_page = 1 self.per_page = per_page # divmod是取余,divmod(101,10)结果是10和1,10是页码数,10+1是总页码数 a, b = divmod(all_count, per_page) # 如果b大于0,意味着不是整除,总页码数=页码数+1 if b: a = a + 1 # 总页码数属性 self.all_pager = a # 每页总共显示多少个页码 self.show_page = show_page self.base_url = base_url # 第几条开始 def start(self): return (self.current_page - 1) * self.per_page # 第几条结束 def end(self): return self.current_page * self.per_page # 假设per_page=10 # 页码 每页显示开始和结束(不包结束的那条) # 1 0-10 # 2 10-20 # 3 20-30 #获取 首页 上一页 页码 下一页 尾页的标签 def pager(self): # v = "<a href='/custom.html?page=1'>1</a><a href='/custom.html?page=2'>2</a>" # return v # 页码列表 page_list = [] ######################## 页码判断 ############################ # 每页显示的页码数11的一半,方便后面取到当前页码的前5页和后5页 half = int((self.show_page - 1) / 2) # 如果总页码数 < 每页显示的页码数11 if self.all_pager < self.show_page: begin = 1 stop = self.all_pager + 1 # +1是因为range要头不要尾 # 如果总页码数 >= 每页显示的页码数11 else: # 如果当前页码 <=5,为了防止出现负数的页码,这里永远显示1,11 if self.current_page <= half: begin = 1 stop = self.show_page + 1 # 如果当前页码 > 5: else: # 如果当前页码+5 > 总页码数,为了防止超过总页码数 if self.current_page + half > self.all_pager: begin = self.all_pager - self.show_page + 1 stop = self.all_pager + 1 # 如果当前页码+5 <= 总页码数 else: begin = self.current_page - half stop = self.current_page + half + 1 ######################## 首页 ############################### first_page = "<li><a href='%s?page=1'>首页</a></li>" % (self.base_url) page_list.append(first_page) ######################## 上一页 ############################### # 如果当前页码<= 1,点上一页没跳转,因为href没设置url if self.current_page <= 1: prev = "<li><a href='#'>上一页</a></li>" # 如果当前页码> 1,href设置url和当前页码-1 else: prev = "<li><a href='%s?page=%s'>上一页</a></li>" % (self.base_url, self.current_page - 1,) # 页码列表追加 上一页 的标签 page_list.append(prev) ########################## 页码 ################################# for i in range(begin, stop): #如果页码等于当前页码,这个标签就被选中,写上class='active',它是bootstrap分页的样式类 if i == self.current_page: temp = "<li class='active'><a href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i,) else: temp = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i,) page_list.append(temp) ######################### 下一页 ################################ # 如果当前页码 >= 总页码数,点下一页没跳转 if self.current_page >= self.all_pager: nex = "<li><a href='#'>下一页</a></li>" # 如果当前页码 < 总页码数,href设置url和当前页码+1 else: nex = "<li><a href='%s?page=%s'>下一页</a></li>" % (self.base_url, self.current_page + 1,) # 页码列表追加 下一页 的标签 page_list.append(nex) ######################## 尾页 ############################### end_page = "<li><a href='%s?page=%s'>尾页</a></li>" % (self.base_url,self.all_pager) page_list.append(end_page) ######################## 返回字符串类型的所有标签 ###################################### # ''.join['a','b','c','d',....]结果是'a,b,c,d...' return ''.join(page_list)