基于在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})
插件显示