python web框架 之 自定分页组件<万能应用版>
最近学习了django 框架,感觉这个web框架很牛……but虽然自带分页功能,但是局限性太强,只能django框架自己使用!同时页面渲染出来的友好性也不高。
索性那就自己定制一个分页组件,如果需要直接调用就好!
注:为了好看,引用了bootstrap插件,还请各位老哥自行下载哈!
第一步:python用类实现的分页方法:
class PageInfo(object): def __init__(self,current_page,all_count,per_page,base_url,show_page=11): a, b = divmod(all_count, per_page) if b: a += 1 self.all_pages = a #获取总页数 try: #判断是否为数字整型 self.current_page=int(current_page) #当前页 except Exception as e: self.current_page = 1 #异常直接跳到第一页 self.per_page=per_page # 每页多少条数据 self.base_url = base_url # url self.show_page = show_page #页面要显示的页面个数 def start(self): #数据的起始位置 return (self.current_page-1)*self.per_page def end(self): #数据的结束位置 return self.current_page*self.per_page #获取所有的页面前五个,后五个 def pager(self): page_list = [] half = int((self.show_page-1)/2) if self.current_page<=half: #当前页码小于5时 begin = 1 stop = self.show_page + 1 else: if self.current_page+half >= self.all_pages: #当前页码+5超过最大页时 begin = self.all_pages - 11 stop = self.all_pages + 1 else: #页码在整个总页码数的中间 begin = self.current_page-half stop = self.current_page + half +1 #上一页 if self.current_page <=1: prov = "<li><a href='#'>上一页</a></li>" else: prov = "<li><a href='%s?page=%s'>上一页</a></li>"%(self.base_url,self.current_page-1) page_list.append(prov) # 中间10页 for i in range(begin,stop): if i == self.current_page: v = "<li class='active'><a href='%s?page=%s'>%s</a></li>" % (self.base_url,i, i) else: v = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url,i, i) page_list.append(v) #下一页 if self.current_page >=self.all_pages: nex = "<li><a href='#'>下一页</a></li>" else: nex = "<li><a href='%s?page=%s'>下一页</a></li>"%(self.base_url,self.current_page+1) page_list.append(nex) return "".join(page_list)
第二步,通过函数调用这个类内的方法:
def custom(request): all_count = models.UserInfo.objects.all().count() #统计要操作的UserInfo表内有多少条数据 page_info = PageInfo(request.GET.get("page"),all_count,10,"/custom") #实例化出一个对象 user_list = models.UserInfo.objects.all()[page_info.start():page_info.end()] #[起始位置:结束位置] return render(request,"custom.html",{"user_list":user_list,"page_info":page_info})#把类对象传递到页面
第三步,模版页面渲染<custom.html文件>:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css" /> </head> <body> <h3>用户列表</h3> <ul> {% for row in user_list %} <li>{{ row.name }}</li> {% endfor %} </ul> {#使用的是bootstrap插件中的方法渲染选择框#} <nav aria-label="Page navigation"> <ul class="pagination"> {{ page_info.pager|safe }} </ul> </nav> {#{{ page_info.pager|safe }} {# 注意:页码接收到对象之后,直接调用其方法,不需要加括号,页面会自动执行渲染!#} {# 语法:{{ 对象名.方法|safe}} 告诉页面这代码是安全的 #} </body> </html>
以上仅仅是一个分页功能的简单实现。开发的时候,把代码粘贴出来,导入引用!