Python:分页工具

简述

ps[2016.2.13]:更新一个问题,下面的源代码有误,具体往下看.
ps[2016.2.27]:将原来的函数组成一个类,完全兼容原来的使用方式.


# 错误代码*****************************
'''
htmls = htmls.append(
liahref % (
currentpage, url, lenindex, ipagesize, currentpage,
lenindex) if lenindex == noformatpage else liahref % (
pageclass,
url, lenindex, ipagesize, pageclass, lenindex))
'''
# 错误代码***********************************************************

# 正确代码*****************************
htmls.append(
liahref % (
currentpage, url, lenindex, ipagesize, currentpage,
lenindex) if lenindex == noformatpage else liahref % (
pageclass,
url, lenindex, ipagesize, pageclass, lenindex))
# 正确代码***********************************************************

这是一个伪代码,因分页需要数据库配合,所以这里只给出分页的代码.

分页效果图
image-2402

python Logo
image-2403

源码

代码里面有很详细的注释,不在过于解释了.

v1.0[2016.2.27]:


"""

分页程序. 2016.2.27 add
"""
class Pager(object):
"""
生成代码示例[使用了妹子UI的分页.参照:http://amazeui.org/widgets/pagination]:
page: 当前页数,从1开始.
pagesize: 每页里面多少数据,一般为10.
rowscount: 查询数据库中的总数(一共有多少条数据,不能添加查询条件,直接count即可).
url: 访问地址[注意:这里没有处理url本身带有参数的问题],这里自动添加了page和pagesize参数(!!丢弃了原来的所有参数,若有的话)
countshow=Flase:默认不显示(总XXX条,共XX页,当前X页),如需开启,请传递True.
"""

def repage(self, page, pagesize, rowscount, url,countshow=False):
# 页码
ipage = int(page)
# 原始page ,数值不会被改变
noformatpage = int(page) # 原始page
# 页码大小
ipagesize = int(pagesize)
# 总数量
irowscount = int(rowscount)
# 进行数值限定
if ipage <= 1: ipage = 1 # 进行分页查询时,需要跳过的数据. # 这个ipage和noformatpage是有区别的!!! # 例如,当前是第二页,那么下面这个ipage是10,而noformatpage是不变的2. ipage = (ipage - 1) * ipagesize # 给当前页添加一个css标记 currentpage = "am-active" # 当前 # 不添加标记 pageclass = "" # 正常 # 空包标记,用于替换. black = "" ''' 格式化数据. 主要作用: 大于/小于当前页5个的自动隐藏. 比如: 当前是第6页,那么只显示1-11页,并且第6页在中间. 示例如下: 1,2,3,4,5,[6],7,8,9,10,11 第8页的时候: 3,4,5,6,7,[8],9,10,11,12,13 以此类推... ''' def formatstyle(item, noformatpage): # 标记最大隐藏的.可配置. maxhidden = noformatpage + 5 # 标记最小隐藏的.可配置 minhidden = noformatpage - 5 # 为当前页添加css标记. if item == noformatpage: return liahref % (currentpage, black, url, item, ipagesize, currentpage, item) elif (minhidden) <= item <= (maxhidden): # 这个地方是控制显示的,只有符合当前页+5或者-5之内的才显示. return liahref % ( pageclass, black, url, item, ipagesize, pageclass, item) else: # 不满足条件的全都隐藏. return liahref % ( pageclass, hiddenstyle, url, item, ipagesize, pageclass, item) # 隐藏数据. hiddenstyle = "display:none;" ''' %1: 添加各种class,在这里就是:标记当前页. %2: 设置隐藏/显示(通过css控制) %3: url地址,不带参数的url地址. %4: 当前页码,从1开始. %5: 数据大小. %6: 标记当前页. %7: 显示的名称. ''' liahref = "

  • %s
  • "
    # 循环生成数据,并且使用formatstyle控制显示或隐藏.
    htmls = [formatstyle(item, noformatpage) for item in range(0, irowscount // ipagesize)]
    # 获取总页数
    countpage = len(htmls)
    # 处理余数的情况
    if irowscount % ipagesize != 0:
    # 最后一页.
    lenindex = len(htmls) + 1
    # 赋值给总页数
    countpage = lenindex
    # 新增到最后.
    print(pageclass)
    print(url)
    print(lenindex)
    print(ipagesize)
    print(pageclass)
    print(lenindex)
    # liahref % ("", "http://localhost:5000/admin/list",68,10, "", 68)
    htmls.append(liahref % (
    currentpage,black, url, lenindex, ipagesize, currentpage,
    lenindex) if lenindex == noformatpage else liahref % (
    pageclass,black, url, lenindex, ipagesize, pageclass, lenindex))
    # 正确代码***********************************************************
    # 参考上面的a,只是去掉了外层的li标记
    ahref = "%s"
    # 第一页和上一页
    firsthrefdisabled = "am-disabled"
    # 生成默认禁用数据
    prevhref = "上一页"
    firsthref = "第一页"
    # 只有当大于1的时候第一页和上一页才可以用.
    if noformatpage > 1:
    firsthrefdisabled = black
    prevhref = ahref % (url, (noformatpage - 1), ipagesize, currentpage, '上一页')
    firsthref = ahref % (url, 1, ipagesize, currentpage, '第一页') if 1 == noformatpage else ahref % (
    url, 1, ipagesize, pageclass, '第一页')
    # 新增到最前面
    htmls.insert(0,
    "

  • %s
  • %s
  • " % (
    firsthrefdisabled, firsthref, firsthrefdisabled,
    prevhref))
    # 第一页和上一页END.
    # 下一页和最末页
    lasthrefdisabled = "am-disabled"
    # 生成默认禁用数据
    nexthref = "下一页"
    lastindexhref = "最末页"
    # 只有当小于总数的时候下一页和最末页才可用.
    if noformatpage < (countpage): lasthrefdisabled = black nexthref = ahref % (url, (noformatpage + 1), ipagesize, currentpage, '下一页') lastindexhref = ahref % (url, countpage, ipagesize, currentpage, '最末页') htmls.append( "

  • %s
  • %s
  • " % (
    lasthrefdisabled, nexthref, lasthrefdisabled, lastindexhref))
    # 下一页和最末页END.
    # 显示最后的数据.
    if countshow:
    htmls.append("总%s条,共%s页,当前%s页" % (irowscount, (len(htmls) - 2), page))
    return ipage, ipagesize, ''.join(htmls)

    v0.9[建议使用最新版本.]:

    '''
    v0.9[建议使用最新版本.]
    这是一个分页的伪代码[使用了Flask(不过实际使用什么也无所谓)].
    效果可以看[Pagination.png]图片.
    涉及到数据库和返回给前台.
    这里只提供了一个分页的方法,注释很详细.
    prd.
    pruidong@gmail.com
    2015.12.30
    '''
    '''
    分页程序.
    生成代码示例[使用了妹子UI的分页.参照:http://amazeui.org/widgets/pagination]:

    总840条,共83页,当前6页
    page: 当前页数,从1开始.
    pagesize: 每页里面多少数据,一般为10.
    rowscount: 查询数据库中的总数(一共有多少条数据,不能添加查询条件,直接count即可).
    url: 访问地址[注意:这里没有处理url本身带有参数的问题],这里自动添加了page和pagesize参数(!!丢弃了原来的所有参数,若有的话)
    v0.9[建议使用最新版本.]
    '''
    def repage(page, pagesize, rowscount, url):
    # 页码
    ipage = int(page)
    # 原始page ,数值不会被改变
    noformatpage = int(page) # 原始page
    # 页码大小
    ipagesize = int(pagesize)
    # 总数量
    irowscount = int(rowscount)
    # 进行数值限定
    if ipage <= 1: ipage = 1 # 进行分页查询时,需要跳过的数据. # 这个ipage和noformatpage是有区别的!!! # 例如,当前是第二页,那么下面这个ipage是10,而noformatpage是不变的2. ipage = (ipage - 1) * ipagesize # 给当前页添加一个css标记 currentpage = "am-active" # 当前 # 不添加标记 pageclass = "" # 正常 # 空包标记,用于替换. black = "" ''' 格式化数据. 主要作用: 大于/小于当前页5个的自动隐藏. 比如: 当前是第6页,那么只显示1-11页,并且第6页在中间. 示例如下: 1,2,3,4,5,[6],7,8,9,10,11 第8页的时候: 3,4,5,6,7,[8],9,10,11,12,13 以此类推... ''' def formatstyle(item, noformatpage): # 标记最大隐藏的.可配置. maxhidden = noformatpage + 5 # 标记最小隐藏的.可配置 minhidden = noformatpage - 5 # 为当前页添加css标记. if item == noformatpage: return liahref % (currentpage, black, url, item, ipagesize, currentpage, item) elif (minhidden) <= item <= (maxhidden): # 这个地方是控制显示的,只有符合当前页+5或者-5之内的才显示. return liahref % ( pageclass, black, url, item, ipagesize, pageclass, item) else: # 不满足条件的全都隐藏. return liahref % ( pageclass, hiddenstyle, url, item, ipagesize, pageclass, item) # 隐藏数据. hiddenstyle = "display:none;" ''' %1: 添加各种class,在这里就是:标记当前页. %2: 设置隐藏/显示(通过css控制) %3: url地址,不带参数的url地址. %4: 当前页码,从1开始. %5: 数据大小. %6: 标记当前页. %7: 显示的名称. ''' liahref = "

  • %s.
  • "

    # 循环生成数据,并且使用formatstyle控制显示或隐藏.
    htmls = [formatstyle(item, noformatpage) for item in range(1, irowscount // ipagesize)]

    # 获取总页数
    countpage = len(htmls)
    # 处理余数的情况
    if irowscount % ipagesize != 0:
    # 最后一页.
    lenindex = len(htmls) + 1
    # 赋值给总页数
    countpage = lenindex
    # 新增到最后.
    # 错误代码*****************************
    '''
    htmls = htmls.append(
    '''
    # 错误代码***********************************************************

    # 正确代码*****************************
    htmls.append(liahref % (currentpage, url, lenindex, ipagesize, currentpage,lenindex) if lenindex == noformatpage else liahref % (pageclass,url, lenindex, ipagesize, pageclass, lenindex))
    # 正确代码***********************************************************
    #参考上面的a,只是去掉了外层的li标记
    ahref = "%s."

    # 第一页和上一页
    firsthrefdisabled = "am-disabled"
    # 生成默认禁用数据
    prevhref = "上一页"
    firsthref = "第一页"
    # 只有当大于1的时候第一页和上一页才可以用.
    if noformatpage > 1:
    firsthrefdisabled = black
    prevhref = ahref % (url, (noformatpage - 1), ipagesize, currentpage, '上一页')
    firsthref = ahref % (url, 1, ipagesize, currentpage, '第一页') if 1 == noformatpage else ahref % (
    url, 1, ipagesize, pageclass, '第一页')
    # 新增到最前面
    htmls.insert(0,
    "

  • %s
  • %s
  • " % (
    firsthrefdisabled, firsthref, firsthrefdisabled,
    prevhref))
    # 第一页和上一页END.
    # 下一页和最末页
    lasthrefdisabled = "am-disabled"
    # 生成默认禁用数据
    nexthref = "下一页"
    lastindexhref = "最末页"
    # 只有当小于总数的时候下一页和最末页才可用.
    if noformatpage < (countpage): lasthrefdisabled = black nexthref = ahref % (url, (noformatpage + 1), ipagesize, currentpage, '下一页') lastindexhref = ahref % (url, countpage, ipagesize, currentpage, '最末页') htmls.append( "

  • %s
  • %s
  • " % (
    lasthrefdisabled, nexthref, lasthrefdisabled, lastindexhref))
    # 下一页和最末页END.

    # 显示最后的数据.
    htmls.append("总%s条,共%s页,当前%s页" % (irowscount, (len(htmls) - 2), page))
    return ipage, ipagesize, ''.join(htmls)
    @app.route('/indexs', methods=['POSTS', 'GET'])
    def seetext():
    page = request.args.get('page', 1)
    pagesize = request.args.get('pagesize', 10)
    see = SeeText()
    # 获取总数--不要带条件!!!
    rowscount = see.count()
    # 参数请参考方法说明.
    pageinfo = repage(page=page, pagesize=pagesize, rowscount=rowscount, url=request.base_url)
    # 查询数据
    data = see.findAll(page[0], pagesize)
    # 转换一下,第二项是分页的数据.
    pageinfo = ''.join(pageinfo[2])
    # 返回数据给前台
    return render_template("/index/index.html", seetextdata=data, pageInfo=pageinfo)

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    *

    此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据