1. 自定义分页效果
可以实现查找 首页和最后一页,上一页和下一页,以及指定页
:
2. 自定义分页的实现
模型Model部分的代码:
models.py
:
from django.db import models
class UserType(models.Model):
"""
用户类型表
"""
title = models.CharField(max_length=32)
class UserInfo(models.Model):
"""
用户表
"""
name = models.CharField(max_length=16)
age = models.IntegerField()
ut = models.ForeignKey('UserType', on_delete=models.CASCADE)
控制器Controller部分的代码:
vews.py
:
from django.shortcuts import render, HttpResponse
from app01 import models
from utils.pagger import PageInfo
class PageInfo:
def __init__(self, current_page, per_page, count_sum, base_url, show_page=11):
"""
:param current_page:当前的页码
:param per_page:每页显示的数据量
:param count_sum:总的数据量
"""
try:
self.current_page = int(current_page)
except Exception as e:
self.current_page = 1
self.per_page = per_page
self.count_sum = count_sum
a, b = divmod(count_sum, per_page)
if b:
a += 1
# page_num:所有页码的数量
self.sum_page_num = 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
def pager(self):
half = int((self.show_page - 1) / 2)
# 如果总页数小于11
if self.sum_page_num < self.show_page:
begin = 1
stop = self.sum_page_num + 1
else:
if self.current_page <= half:
begin = 1
stop = self.show_page + 1
else:
if self.current_page + half > self.sum_page_num:
begin = self.sum_page_num - self.show_page + 1
stop = self.sum_page_num + 1
else:
begin = self.current_page - half
stop = self.current_page + half + 1
page_num_list = []
index_page = '<li><a href="%s?page=1"><span aria-hidden="true">首页</span></a></li>' % (self.base_url)
page_num_list.append(index_page)
if self.current_page <= 1:
prev_page = '<li><a href="#"><span aria-hidden="true">«</span></a></li>'
else:
prev_page = '<li><a href="%s?page=%s"><span aria-hidden="true">«</span></a></li>' % (
self.base_url, self.current_page - 1,)
page_num_list.append(prev_page)
for i in range(begin, stop):
if i == self.current_page:
page_num_list.append(
"<li class='active'><a class='active' href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i))
else:
page_num_list.append("<li><a class='active' href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i))
if self.current_page >= self.sum_page_num:
next_page = '<li><a href="#"><span aria-hidden="true">»</span></a></li>'
else:
next_page = '<li><a href="%s?page=%s"><span aria-hidden="true">»</span></a></li>' % (
self.base_url, self.current_page + 1,)
page_num_list.append(next_page)
final_page = '<li><a href="%s?page=%s"><span aria-hidden="true"></span>最后一页</a></li>' % (
self.base_url, self.sum_page_num)
page_num_list.append(final_page)
return ''.join(page_num_list)
def index(request):
count_sum = models.UserInfo.objects.count()
page_info = PageInfo(request.GET.get('page'), 1, count_sum, '/index.html')
user_info = models.UserInfo.objects.all()[page_info.start():page_info.end()]
return render(request, 'index.html', {'user_info': user_info, 'page_info': page_info})
视图View部分的代码:
...
<table class="table table-bordered">
<tr>
<th>用户名</th>
<th>年龄</th>
</tr>
{% for item in user_info %}
<tr>
<td> {{ item.name }}</td>
<td> {{ item.age }}</td>
</tr>
{% endfor %}
</table>
<nav aria-label="Page navigation">
<ul class="pagination">
{{ page_info.pager|safe }}
</ul>
</nav>
...
3. 分页插件
可以把控制器部分的PageInfo类放在单独的Python文件中,可以复用。新建utils目录,然后将其放在utils目录下:
pager.py
class PageInfo:
def __init__(self, current_page, per_page, count_sum, base_url, show_page=11):
"""
:param current_page:当前的页码
:param per_page:每页显示的数据量
:param count_sum:总的数据量
"""
try:
self.current_page = int(current_page)
except Exception as e:
self.current_page = 1
self.per_page = per_page
self.count_sum = count_sum
a, b = divmod(count_sum, per_page)
if b:
a += 1
# page_num:所有页码的数量
self.sum_page_num = 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
def pager(self):
half = int((self.show_page - 1) / 2)
# 如果总页数小于11
if self.sum_page_num < self.show_page:
begin = 1
stop = self.sum_page_num + 1
else:
if self.current_page <= half:
begin = 1
stop = self.show_page + 1
else:
if self.current_page + half > self.sum_page_num:
begin = self.sum_page_num - self.show_page + 1
stop = self.sum_page_num + 1
else:
begin = self.current_page - half
stop = self.current_page + half + 1
page_num_list = []
index_page = '<li><a href="%s?page=1"><span aria-hidden="true">首页</span></a></li>' % (self.base_url)
page_num_list.append(index_page)
if self.current_page <= 1:
prev_page = '<li><a href="#"><span aria-hidden="true">«</span></a></li>'
else:
prev_page = '<li><a href="%s?page=%s"><span aria-hidden="true">«</span></a></li>' % (
self.base_url, self.current_page - 1,)
page_num_list.append(prev_page)
for i in range(begin, stop):
if i == self.current_page:
page_num_list.append(
"<li class='active'><a class='active' href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i))
else:
page_num_list.append("<li><a class='active' href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i))
if self.current_page >= self.sum_page_num:
next_page = '<li><a href="#"><span aria-hidden="true">»</span></a></li>'
else:
next_page = '<li><a href="%s?page=%s"><span aria-hidden="true">»</span></a></li>' % (
self.base_url, self.current_page + 1,)
page_num_list.append(next_page)
final_page = '<li><a href="%s?page=%s"><span aria-hidden="true"></span>最后一页</a></li>' % (
self.base_url, self.sum_page_num)
page_num_list.append(final_page)
return ''.join(page_num_list)