在 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 分页中显示页面项目计数的主要内容,如果未能解决你的问题,请参考以下文章

django对原始搜索结果进行分页

Django在一页中合并查询集

Django框架-CRM项目之分页实现

分页取决于 Django 中的项目分组

如何在Django项目中组织大量页面的分页?

如何在 React 引导表分页中选择默认的项目数