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)