在view中定义一个分页的类:
class paging():
'''
此为文章分页功能,需要往里传递三个参数,分别如下:
tablename:表名
page:页码号,即第几页,这个一般从URL的GET中得到
pagenum:每页显示多少条记录
'''
def __init__(self,tablename,page,pagenum):
from django.core.paginator import Paginator
self.tablename = tablename
self.page = int(page)
self.pagenum = int(pagenum)
tn = self.tablename.objects.all().order_by('-id') #查询tablename表中所有记录数,并以降序的方式对id进行排列
self.p = Paginator(tn,self.pagenum) #对表数据进行分页,每页显示pagenum条
def pt(self):
'''共有多少条数据'''
return self.p.count
def pn(self):
'''总页数'''
return self.p.num_pages
def pr(self):
'''获取页码列表'''
return self.p.page_range
def pl(self):
'''第page页的数据列表'''
return self.p.page(self.page).object_list
def pp(self):
'''是否有上一页'''
return self.p.page(self.page).has_previous()
def np(self):
'''是否有下一页'''
return self.p.page(self.page).has_next()
def ppn(self):
'''上一页的页码号'''
if self.page <= 1: #假如当前页在第一页,那就直接返回1
return '1'
else:
return self.p.page(self.page).previous_page_number()
def npn(self):
'''下一页的页码号'''
if self.p.page(self.page).has_next() == False: #如果当前页不存在下一页,则返回最后一个页码值
return self.page
else:
return self.p.page(self.page).next_page_number()
然后view相关的地方,调用这个类,这是我任务系统中用到的:
def taskinfo(request,Pa):
username = request.session.get('username',None) #从session中获取用户登陆名
userpermissions = User.objects.get(name = username).permissions #获取该用户的权限
if not Pa: #假如没有获取到Pa值,即Pa为空值的时候,就把1赋值给Pa,这里主要在模板中使用超链接的时候用到
Pa = 1
p = paging(Task,Pa,19) #创建分页的实例,并传递相关的参数进去,Task是任务表名,Pa是当前页数,19表示每页显示19条数据
pn=p.pn() #总页数
pt=p.pt() #共有多少条数据
pl=p.pl() #第x页的数据列表
pp=p.pp() #是否有前一页
np=p.np() #是否有后一页
ppn=p.ppn() #前一页页码
npn=p.npn() #后一页页码
cp = int(Pa) #获取当前页,并转为型形,方便下面进行计算和比较,并且模板文件中也要用到比较
if cp < 5: #这里进行判断,假如当前页小于5的时候,
pr = p.pr()[0:9] #pr为获取页码列表,即当前页小于5的时候,模板中将显示第1页至第9页,如 1 2 3 4 5 6 7 8 9
elif int(pn) - cp < 5: #假如最后页减当前页小于5时
pr = p.pr()[int(pn)-9:int(pn)] #页码列表显示最后9页,如共有30页的话,那显示:22 23 24 25 26 27 28 29 30
else: #其它情况
pr = p.pr()[cp-5:cp+4] #其它情况显示当前页的前4条至后4条,如当前在第10页的话,那显示:6 7 8 9 10 11 12 13 14
本文来自 linux系统运维:http://www.linuxyw.com ,转贴请注明出处
urls.py中的相关配置:
(r'^taskinfo-?(\d{1,})?.html$',taskinfo),
?:表示0或1个
(\d) :是把数字传递到view中,而我view中,是用Pa来接收的,你不一定要用Pa,名字自己随便定义的
(\d{1,}):{1,}表示1至无限大的数字
(\d{1,})?:表示以在地址中带数字,也可以不带
taskinfo.html,是合法的,可以访问到第一页,因为我在view中,如果没有获取到这个值,就赋给了1,所以就可以访问第一页了
taskinfo-1.html 也是访问第1页
taskinfo-33.html可以访问第33页,等等
模板taskinfo.html相关代码:
PS:我在模板中使用了bootstrap3.0样式
共
{{pt}}条任务,总
{{pn}} 页
{% for p in pr %}
{% endfor %}
解释:
{% ifequal
cp 1 %}class="disabled" {% endifequal %} cp是从后端获取的的当前页数,表示当前页位于第1页的时候,给li一个CSS样式,这个样式是禁止点击按钮。
{% ifequal
cp p %} class="active" {% endifequal %} p是当前页码,cp也是从后端获取到的当前页码,如果2者一致,就给这个li添加一个样式,显示背景为蓝色,比较显眼。
其它变量看上面的view所注释的了,不再解释了。
效果图: