跳转到主要内容

将大型结果集分成页面以便于浏览

项目描述

什么是分页?

此模块有助于将大型项目列表分成页面。用户一次显示一页,可以导航到其他页面。想象一下,你提供了一个公司电话簿,并允许用户搜索条目。如果搜索结果包含23个条目,但你可能只想一次显示不超过10个条目。第一页包含条目1-10,第二页11-20,第三页21-23。有关更多信息,请参阅“Page”类的文档。

我如何使用此模块?

分页模块包含了详细的内联文档和示例。

关于WebHelpers

这是一个独立的模块。之前的版本作为WebHelpers Python模块的一部分存在,即webhelpers.paginate,并与WebHelpers和Pylons web框架紧密耦合。这个版本旨在独立于任何web框架而有用。

继承Page()

此模块支持通过类似列表的对象进行分页。要通过其他类型的对象进行分页,您可以子类化paginate.Page()类,并提供一个包装类,该类定义了如何访问该特殊集合的元素。

您可以在其他paginate_*模块(如paginate_sqlalchemy)中找到示例。基本上,您必须提供一个实现initgetitemlen方法的类。

通过扩展基本类,为其他数据存储(如Elasticsearch/Solr)进行分页是微不足道的。

示例:

class SqlalchemyOrmWrapper(object):
    """Wrapper class to access elements of a collection."""
    def __init__(self, obj):
        self.obj = obj

    def __getitem__(self, range):
        # Return a range of objects of an sqlalchemy.orm.query.Query object
        return self.obj[range]

    def __len__(self):
        # Count the number of objects in an sqlalchemy.orm.query.Query object
        return self.obj.count()

然后您可以创建自己的Page类,它使用上面的包装类:

class SqlalchemyOrmPage(paginate.Page):
    """A pagination page that deals with SQLAlchemy ORM objects."""
    def __init__(self, *args, **kwargs):
        super(SqlalchemyOrmPage, self).__init__(*args, wrapper_class=SqlalchemyOrmWrapper, **kwargs)

如您所见,它并没有做太多。它基本上调用paginate.Page.init,并将wrapper_class=SqlalchemyOrmWrapper作为参数。paginate.Page实例将使用该包装类来访问元素。

生成当前页面的HTML代码

示例:

p = paginate.Page([], page=15, items_per_page=15, item_count=1010)
# item_count is optional, but we pass a dummy empty resultset for this example
pattern = '$link_first $link_previous ~4~ $link_next $link_last (Page $page our of $page_count - total $item_count)'
p.pager(pattern, url='http://foo.com?x=$page', dotdot_attr={'x':5}, link_attr={'y':6}, curpage_attr={'z':77})
# *_attr arguments are optional and can be used to attach additional classes/attrs to tags

结果如下:

'<a class="L" href="URL?x=1">&lt;&lt;</a> <a class="L" href="URL?x=14">&lt;</a> <a class="L" href="URL?x=1">1</a> <span class="D">..</span> <a class="L" href="URL?x=11">11</a> <a class="L" href="URL?x=12">12</a> <a class="L" href="URL?x=13">13</a> <a class="L" href="URL?x=14">14</a> <span class="C">15</span> <a class="L" href="URL?x=16">16</a> <a class="L" href="URL?x=17">17</a> <a class="L" href="URL?x=18">18</a> <a class="L" href="URL?x=19">19</a> <span class="D">..</span> <a class="L" href="URL?x=68">68</a> <a class="L" href="URL?x=16">&gt;</a> <a class="L" href="URL?x=68">&gt;&gt;</a> (Page 15 our of 68 - total items 1010)'

使用URL生成器生成指向特定结果范围的链接

您可以将url_maker回调传递给生成其他页面URL,给定其编号。必须接受一个int参数并返回一个URI字符串。

示例:

def url_maker(page_number):
    return str('foo/%s' % page_number)
page = paginate.Page(range(100), page=1, url_maker=url_maker)
eq_(page.pager(), '1 <a href="foo/2">2</a> <a href="foo/3">3</a> .. <a href="foo/5">5</a>')

或者,如果您不传递链接构建函数,pager()方法也可以接受url参数,该参数包含页面链接将指向的URL。请确保它包含字符串$page,它将被替换为实际页码。除非将url_maker指定给init,否则必须提供此参数,在这种情况下,此参数将被忽略。

使用链接信息自定义分页模板

如果您不喜欢分页器生成的默认HTML格式,您可以使用link_map()函数生成一个包含您可以在自己的模板中使用链接的字典。

示例:

p.link_map('$link_first $link_previous ~4~ $link_next $link_last (Page $page our of $page_count - total items $item_count)',url='URL?x=$page',dotdot_attr={'class':'D'}, link_attr={'class':"L"}, curpage_attr={'class':"C"})

返回类似以下内容:

{'current_page': {'attrs': {'class': 'C'}, 'href': 'URL?x=15', 'value': 15},
 'first_page': {'attrs': {'class': 'L'}, 'href': 'URL?x=1', 'type': 'first_page', 'value': 1},
 'last_page': {'attrs': {'class': 'L'}, 'href': 'URL?x=68', 'type': 'last_page', 'value': 68},
 'next_page': {'attrs': {'class': 'L'}, 'href': 'URL?x=16', 'type': 'next_page', 'value': 16},
 'previous_page': {'attrs': {'class': 'L'}, 'href': 'URL?x=14', 'type': 'previous_page', 'value': 14},
 'range_pages': [{'attrs': {'class': 'D'}, 'href': '', 'type': 'span', 'value': '..'},
  {'attrs': {'class': 'L'}, 'href': 'URL?x=11', 'type': 'page', 'value': '11'},
  {'attrs': {'class': 'L'}, 'href': 'URL?x=12', 'type': 'page', 'value': '12'},
  {'attrs': {'class': 'L'}, 'href': 'URL?x=13', 'type': 'page', 'value': '13'},
  {'attrs': {'class': 'L'}, 'href': 'URL?x=14', 'type': 'page', 'value': '14'},
  {'attrs': {'class': 'C'}, 'href': 'URL?x=15', 'type': 'current_page', 'value': 15},
  {'attrs': {'class': 'L'}, 'href': 'URL?x=16', 'type': 'page', 'value': '16'},
  {'attrs': {'class': 'L'}, 'href': 'URL?x=17', 'type': 'page', 'value': '17'},
  {'attrs': {'class': 'L'}, 'href': 'URL?x=18', 'type': 'page', 'value': '18'},
  {'attrs': {'class': 'L'}, 'href': 'URL?x=19', 'type': 'page', 'value': '19'},
  {'attrs': {'class': 'D'}, 'href': '', 'type': 'span', 'value': '..'}],
  'radius': 4}

使用link_tag可调用生成自定义链接标记

如果您想为您的项目生成自定义链接标记(例如与bootstrap一起使用),pager接受link_tag参数,该参数期望一个可调用的函数,可以用来轻松覆盖链接的生成方式。

示例:

from paginate import Page, make_html_tag

def paginate_link_tag(item):
    """
    Create an A-HREF tag that points to another page usable in paginate.
    """
    a_tag = Page.default_link_tag(item)
    if item['type'] == 'current_page':
        return make_html_tag('li', a_tag, **{'class':'active'})
    return make_html_tag('li', a_tag)

paginator.pager(
curpage_attr={'class':'current_page'},
dotdot_attr={'class':'spacer'},
symbol_first='<i class="fa fa-chevron-circle-left"></i>',
symbol_last='<i class="fa fa-chevron-circle-right"></i>',
symbol_previous='<i class="fa fa-chevron-left"></i>',
symbol_next='<i class="fa fa-chevron-right"></i>',
link_tag=paginate_link_tag)

版本0.5.6 - 2016-11-22

变更

  • 修复了pypi的元数据

版本0.5.5 - 2016-11-22

变更

  • Python 2.7/3.4+兼容性改进

版本0.5.4 - 2016-04-25

变更

  • 添加了半径大小配置选项

版本0.5.3 - 2016-03-09

变更

  • Unocode相关修复

版本0.5.2 - 2015-08-29

变更

  • 在处理长度之前处理切片 - 以改善与包含项目计数的各种数据库的使用体验
  • 错误修复

版本0.5.1 - 2015-10-22

变更

  • 错误修复

版本0.5.0 - 2015-08-29

变更

  • link_tag可调用现在可以传递以生成自定义链接标记
  • page对象现在具有link_map()方法,该方法返回一个信息映射,可用于根据分页器数据生成自定义标记

版本0.4.0 - 2012-12-06

Paginate之前作为webhelpers.paginate在webhelpers包中维护。此版本是一个独立版本,应在WebHelpers之外的环境中很有用。

变更

  • Python 3兼容性。
  • SQLAlchemyObject和SQLAlchemyQuery集合不再自动检测。相反,您可以使用来自paginate_sqlalchemy模块的相应Page类,该模块也可在PyPi上获得。
  • 不再支持presliced_list参数
  • 'page_nr'和'current_page'已被弃用,现在已删除。请使用'page'代替。
  • 不生成自动URL。您需要将包含要在其中放置页码的占位符$page的URL作为参数传递给Page.pager()方法。请注意,URL不会进行引号转义。
  • Page.pager() 方法不再自动添加CSS类。如果您想保留旧的行为,需要显式传递这些参数:link_attr={'class':'pager_link'} curpage_attr={'class':'pager_curpage'} dotdot_attr={'class':'pager_dotdot'}
  • Page.pager() 的 partial_param 参数已消失。您应该在 'url' 参数中使用自己的URL进行AJAX/局部更新。
  • Page.pager() 的 page_param 参数也已消失,因为URL生成已经被大大简化。
  • Page.pager() 返回的字符串已经是转义过的HTML。因此,您需要告诉您的Web框架直接使用该字符串而不进行进一步转义。参数 symbol_first、symbol_last、symbol_previous 和 symbol_next 现在用 < 和 > 代替 "<" 和 ">"。
  • Page.repr 现在返回一个简短的表示。例如:<paginate.Page: 1 of 1> Page.str 返回您可能熟悉的详细视图。

版本 0.3.2 - 2008-01-31

在 PyPi 上公开发布

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪一个,请了解有关 安装包 的更多信息。

源分布

paginate-0.5.7.tar.gz (19.3 kB 查看散列)

上传时间

构建分布

paginate-0.5.7-py2.py3-none-any.whl (13.7 kB 查看散列)

上传时间 Python 2 Python 3

由以下机构支持