基于在django项目中自定制分页组件
插件:
from django.utils.safestring import mark_safe
class MyPagenation():
def __init__(self,page_num,total_count,per_page_num,page_num_show,base_url):
self.per_page_num = per_page_num # 每页显示10条
# 页面生成页码的数量
self.page_num_show = page_num_show
self.base_url = base_url #
try:
page_num = int(page_num)
except Exception:
page_num = 1
self.page_num = page_num
shang, yu = divmod(total_count, self.per_page_num) # shang:商 yu:余数
# 总页码数
if yu:
page_num_count = shang + 1
else:
page_num_count = shang
self.page_num_count = page_num_count
if page_num <= 0:
page_num = 1
elif page_num > page_num_count:
page_num = page_num_count
# 3 4 5 6 7 4 5 6 7 8 9 10
half_show = self.page_num_show // 2 # 2
if page_num - half_show <= 0:
start_page_num = 1
end_page_num = self.page_num_show + 1 # 9
elif page_num + half_show > page_num_count:
start_page_num = page_num_count - self.page_num_show + 1 # 26 - 5 = 21
end_page_num = page_num_count + 1 # 27 [21,22,23,24,25,26]
else:
start_page_num = page_num - half_show # 4 1
end_page_num = page_num + half_show + 1 # 9 6
self.start_page_num = start_page_num
self.end_page_num = end_page_num
@property
def start_data_num(self):
return (self.page_num - 1) * self.per_page_num
@property
def end_data_num(self):
return self.page_num * self.per_page_num
def page_hmtl(self):
page_num_range = range(self.start_page_num, self.end_page_num)
page_html = ''
page_pre_html = '<nav aria-label="Page navigation"><ul class="pagination">'
page_html += page_pre_html
first_page_html = '<li><a href="{1}?page={0}" aria-label="Previous"><span aria-hidden="true">首页</span></a></li>'.format(1, self.base_url)
page_html += first_page_html
if self.page_num <= 1:
pre_page = '<li class="disabled"><a href="javascript:void(0)" aria-label="Previous"><span aria-hidden="true">«</span></a></li>'.format(self.page_num - 1)
else:
pre_page = '<li><a href="{1}?page={0}" aria-label="Previous"><span aria-hidden="true">«</span></a></li>'.format(self.page_num - 1,self.base_url)
page_html += pre_page
for i in page_num_range:
if i == self.page_num:
page_html += '<li class="active"><a href="{1}?page={0}">{0}</a></li>'.format(i,self.base_url)
else:
page_html += '<li><a href="{1}?page={0}">{0}</a></li>'.format(i,self.base_url)
if self.page_num >= self.page_num_count:
page_next_html = '<li class="disabled"><a href="javascript:void(0)" aria-label="Next"><span aria-hidden="true">»</span></a></li>'.format(
self.page_num + 1)
else:
page_next_html = '<li><a href="{1}?page={0}" aria-label="Next"><span aria-hidden="true">»</span></a></li>'.format(
self.page_num + 1,self.base_url)
page_html += page_next_html
last_page_html = '<li><a href="{1}?page={0}" aria-label="Previous"><span aria-hidden="true">尾页</span></a></li>'.format(
self.page_num_count, self.base_url)
page_html += last_page_html
end_html = '</ul></nav>'
page_html += end_html
return mark_safe(page_html)
在settings里做插件相关配置(配置每页显示数据,显示页码数):
PER_PAGE_NUM = 10 #每页显示多少条数据 PAGE_NUM_SHOW = 5 #显示的页码数
插件在view试图里使用示例:
def customers(request):
#当前页 例如 1
page_num = request.GET.get('page')
base_url = request.path #访问的路径
customer_count = models.Customer.objects.all().count()
per_page_num = settings.PER_PAGE_NUM #每页显示多少条数据
page_num_show = settings.PAGE_NUM_SHOW #显示的页码数
page_obj = MyPagenation(page_num,customer_count,per_page_num,page_num_show,base_url)
page_html = page_obj.page_hmtl()
customer_objs = models.Customer.objects.all().reverse()[page_obj.start_data_num:page_obj.end_data_num]
return render(request,'saleshtml/customers.html',{'customer_objs':customer_objs,'page_html':page_html})
插件显示

来源:https://www.cnblogs.com/dylan123/p/12589060.html