将大型结果集分成页面以便于浏览
项目描述
什么是分页?
此模块有助于将大型项目列表分成页面。用户一次显示一页,可以导航到其他页面。想象一下,你提供了一个公司电话簿,并允许用户搜索条目。如果搜索结果包含23个条目,但你可能只想一次显示不超过10个条目。第一页包含条目1-10,第二页11-20,第三页21-23。有关更多信息,请参阅“Page”类的文档。
我如何使用此模块?
分页模块包含了详细的内联文档和示例。
关于WebHelpers
这是一个独立的模块。之前的版本作为WebHelpers Python模块的一部分存在,即webhelpers.paginate,并与WebHelpers和Pylons web框架紧密耦合。这个版本旨在独立于任何web框架而有用。
继承Page()
此模块支持通过类似列表的对象进行分页。要通过其他类型的对象进行分页,您可以子类化paginate.Page()类,并提供一个包装类,该类定义了如何访问该特殊集合的元素。
您可以在其他paginate_*模块(如paginate_sqlalchemy)中找到示例。基本上,您必须提供一个实现init
、getitem
和len
方法的类。
通过扩展基本类,为其他数据存储(如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"><<</a> <a class="L" href="URL?x=14"><</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">></a> <a class="L" href="URL?x=68">>></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 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945 |
|
MD5 | 81b45b792d8140d78d4f55cce0d5e46d |
|
BLAKE2b-256 | ec4668dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84 |
paginate-0.5.7-py2.py3-none-any.whl 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591 |
|
MD5 | edcc4ae3dddd1b9bd1da6a27d998e674 |
|
BLAKE2b-256 | 909604b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d |