自定义分页组件
组件代码(page.py):
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 # 页面生成页码的数量 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 half_show = self.page_num_show // 2 if page_num - half_show <= 0: start_page_num = 1 end_page_num = self.page_num_show + 1 elif page_num + half_show > page_num_count: start_page_num = page_num_count - self.page_num_show + 1 end_page_num = page_num_count + 1 else: start_page_num = page_num - half_show end_page_num = page_num + half_show + 1
# 如果总数据的页数小于设定的展示页码总数,那么就显示总数据的页数
if page_num_count < self.page_num_show:
start_page_num = 1
end_page_num = page_num_count + 1
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)
视图里面的代码配置(views.py):
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})
配置settings.py
PER_PAGE_NUM = 10 #每页显示多少条数据 PAGE_NUM_SHOW = 5 #显示的页码数
样式展示:

Dylan

浙公网安备 33010602011771号