在 django 分页中显示页面项目计数
Posted
技术标签:
【中文标题】在 django 分页中显示页面项目计数【英文标题】:Show page items count in django pagination 【发布时间】:2010-12-13 22:42:49 【问题描述】:我试图弄清楚如何在我的模板中使用 django 分页来显示类似“显示 52 个中的 1-10 个”的内容。
我自己完成了分页,但我没有想到这个要求。 有什么想法吗?
【问题讨论】:
【参考方案1】:正如the documentation 所示,Paginator
对象具有 count
属性,该属性显示所有页面中的对象总数(在它们正在分页的查询集或列表中),Page
对象具有 start_index()
和end_index()
方法。
所以,假设您将 page
传递给模板上下文:
Showing page.start_index - page.end_index of page.paginator.count
【讨论】:
这很有帮助 - 谢谢。唯一需要注意的是,默认情况下,ListView
中的对象称为page_obj
,而不是page
。
我收到了这个错误。 jinja2.exceptions.UndefinedError: 'flask_sqlalchemy.Pagination object' 没有属性 'paginator'
是的,很容易将查询集中的记录总数与模型中的记录总数混淆。如果您想要模型中的记录总数,您需要单独传递它,page.paginator.count
将提供来自查询集的总数。
模型中的记录总数是 paginator.count 而不是 page.paginator.count。回复@yekta【参考方案2】:
您需要在幕后做一些稍微复杂的事情。请注意,虽然我是一名 python 开发人员,但我已经使用 werkzeug 和 jinja2 很长时间了,所以我的 django 语法有点生疏。这也是干编码的(就像我刚刚在浏览器中输入的一样),应该进行测试以确保它按预期工作。
一般我会创建一个分页对象,并将它传递给一个不按页面过滤的查询对象,你也可以告诉它每页有多少个,你在哪个页面上。
所以有点类似于:
Paginator(query, objects_per_page, current_page_number)
然后将生成的分页器对象传递给模板。
在分页器的 init 中,您需要执行以下操作:
def __init__(self, query, objects_per_page, current_page_number):
self.total = query.count()
self.per_page = objects_per_page
self.current_page_number = current_page_number
self.lower_limit = objects_per_page * current_page_number
self.upper_limit = objects_per_page * (current_page_number + 1)
if self.upper_limit > self.total:
self.upper_limit = self.total
self.objects = query[self.lower_limit - 1:self.upper_limit - 1]
然后在模板中你会做类似的事情
Showing paginator.lower_limit-paginator.upper_limit of paginator.total
稍后当您准备好迭代对象时,您可以只迭代 paginator.objects。
我希望这能让您大致了解如何干净地做到这一点。
【讨论】:
Peharps 最好继承内置的 django.core.paginator.Paginator 类来添加 lower_limit 和 upper_limit 属性。 很有可能,我已经有一段时间没有安静地使用 django 了。此外, num_pages 似乎是我所在位置的无效统计数据。您似乎想要对象的总数,而不是页面的总数,但是在 django 的分页器中可能有另一种解决方案。【参考方案3】:django Paginator
对象有一个 num_pages
属性。在您看来,您只需将正确的数据传递给您的模板并在那里显示即可。
作为一个(粗略的)例子:
查看
current_page = ## input param
items_per_page = 10
paginator = Paginator(result, items_per_page)
...
return render_to_response('template.html',
'num_pages': paginator.num_pages,
'start_count': items_per_page * current_page + 1,
'end_count': (items_per_page * current_page + 1) + len(paginator(current_page).object_list)
'items_per_page': items_per_page
模板
showing start_count - end_count of num_pages
(我在没有编译器的情况下编写了这段代码,所以测试一下)
【讨论】:
只需将分页器发送到模板,然后访问分页器属性,例如: offer.previous_page_number 、 offer.next_page_number 、 offer.paginator.count 【参考方案4】:paginator = Paginator(query, settings.SEARCH_DATA_PER_PAGE)
页数:
num_of_pages = paginator.num_pages
所有页面的项目总数:
num_of_objects = paginator.count
您可以根据此数据计算每页的项目数。
【讨论】:
【参考方案5】:totalPages = math.ceil(float(totalRecords)/recordsPerPage)
或
paginatorInstance.num_pages # this is there by default
没有那么难吧?
【讨论】:
以上是关于在 django 分页中显示页面项目计数的主要内容,如果未能解决你的问题,请参考以下文章