【发布时间】:2010-12-13 22:42:49
【问题描述】:
我试图弄清楚如何在我的模板中使用 django 分页来显示类似“显示 52 个中的 1-10 个”的内容。
我自己完成了分页,但我没有想到这个要求。
有什么想法吗?
【问题讨论】:
标签: django django-templates pagination
我试图弄清楚如何在我的模板中使用 django 分页来显示类似“显示 52 个中的 1-10 个”的内容。
我自己完成了分页,但我没有想到这个要求。
有什么想法吗?
【问题讨论】:
标签: django django-templates pagination
正如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。
page.paginator.count 将提供来自查询集的总数。
您需要在幕后做一些稍微复杂的事情。请注意,虽然我是一名 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。
我希望这能让您大致了解如何干净地做到这一点。
【讨论】:
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}}
(我在没有编译器的情况下编写了这段代码,所以测试一下)
【讨论】:
paginator = Paginator(query, settings.SEARCH_DATA_PER_PAGE)
页数:
num_of_pages = paginator.num_pages
所有页面的项目总数:
num_of_objects = paginator.count
您可以根据此数据计算每页的项目数。
【讨论】:
totalPages = math.ceil(float(totalRecords)/recordsPerPage)
或
paginatorInstance.num_pages # this is there by default
没有那么难吧?
【讨论】: