A-A+

django分页功能

2013年12月12日 Python 暂无评论 阅读 8,332 views 次
在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样式
<div>
    <div>
        共<span>{{pt}}</span>条任务,总 <span>{{pn}}</span> 页
    </div>
    <div>
    <ul>
        <li <li {% ifequal cp 1 %}class="disabled" {% endifequal %}><a href="/taskinfo-{{ppn}}.html">&laquo;</a></li>
        <li <li><a href="/taskinfo.html">首页</a></li>
        {% for p in pr %}
            <li {% ifequal cp p %} class="active" {% endifequal %}><a href="/taskinfo-{{p}}.html">{{p}}</a></li>
        {% endfor %}
        <li <li><a href="/taskinfo-{{pn}}.html">尾页</a></li>
        <li <li {% ifequal cp pn %}class="disabled" {% endifequal %}><a href="/taskinfo-{{npn}}.html">&raquo;</a></li>
    </ul>
    </div>
</div>
解释:
 {% ifequal cp 1 %}class="disabled" {% endifequal %}  cp是从后端获取的的当前页数,表示当前页位于第1页的时候,给li一个CSS样式,这个样式是禁止点击按钮。
 {% ifequal cp p %} class="active" {% endifequal %} p是当前页码,cp也是从后端获取到的当前页码,如果2者一致,就给这个li添加一个样式,显示背景为蓝色,比较显眼。
其它变量看上面的view所注释的了,不再解释了。
效果图:

django分页

django分页

关键词:

给我留言

Copyright © linux系统运维 保留所有权利.   Theme  Ality 粤ICP备13023035号-1

用户登录

分享到: