Django灵活的分页

时间:2009-11-13 13:55:47

标签: django pagination

我想实现分页,这样我就可以让用户选择每页的记录数,例如10,25,50等。我应该怎么做呢?是否有我可以添加到我的项目中的应用程序来执行此操作?

由于

4 个答案:

答案 0 :(得分:4)

Django有一个内置于核心的Paginator对象。这是一个相当简单的API。使用两个参数实例化Paginator类:列表和每个“页面”的条目数。我会在底部粘贴一些示例代码。

在您的情况下,您希望允许用户选择每页计数。你可以将每页计数作为URL的一部分(即你的/ page / 10 /),也可以使它成为一个查询字符串(即你的/ page /?p = 10)。

像...一样的东西。

# Assuming you're reading the Query String value ?p=
try:
    per_page = int(request.REQUEST['p'])
except:
    per_page = 25     # default value

paginator = Paginator(objects, per_page)

以下是来自Paginator的Django文档页面的一些示例代码,以便更好地了解它是如何工作的。

>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)

>>> p.count
4
>>> p.num_pages
2
>>> p.page_range
[1, 2]

>>> page1 = p.page(1)
>>> page1
<Page 1 of 2>
>>> page1.object_list
['john', 'paul']

答案 1 :(得分:1)

google on“django pagination”并确保在SQL中使用“覆盖索引”以进行有效查询。

答案 2 :(得分:0)

吨。斯通的答案涵盖了我要说的大部分内容。我只想补充一点,您可以在Generic Views中使用分页。特别是,您可能会发现django.views.generic.list_detail.object_list很有用。

您可以编写一个小包装函数,该函数从request对象获取每页显示的对象数,然后调用object_list

def paginated_object_list(request, page):

    my_queryset=MyModel.objects.all()
    #Here's T. Stone's code to get the number of items per page
    try:
        per_page = int(request.REQUEST['p'])
    except:
        per_page = 25     # default value

    return object_list(request, queryset=my_queryset, 
                                     paginate_by=per_page, page=page)

然后,模板的上下文将包含变量

  
      
  • paginatordjango.core.paginator.Paginator
  • 的一个实例   
  • page_objdjango.core.paginator.Page
  • 的一个实例   

您可以遍历page_obj以显示该页面的对象。

答案 3 :(得分:0)

需要什么?好。

您可以为change_list.html添加自定义控件,例如 pagination 块。

这将是重新加载列表页面,其中包含get参数 per_page ,例如具有某些值onchange事件。

对于您的adminModel,您必须覆盖 changelist_view 方法,您必须处理get参数并将此值设置为list_per_page字段值。

def changelist_view(self, request):
    if request.GET.get('per_page') and int(
            request.GET.get('per_page')) in CHANGELIST_PERPAGE_LIMITS:
        self.list_per_page = int(request.GET.get('per_page'))
    else:
        self.list_per_page = 100
    extra_context = {'changelist_perpage_limits': CHANGELIST_PERPAGE_LIMITS,
                     'list_per_page': self.list_per_page}
    return super(mymodelAdmin, self).changelist_view(request, extra_context)

我使用extra_context访问此值到模板中。也许有更简洁的访问方法,我不知道:-)