【问题标题】:Flexible pagination in DjangoDjango中的灵活分页
【发布时间】:2010-12-16 07:20:01
【问题描述】:

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

谢谢

【问题讨论】:

    标签: django pagination


    【解决方案1】:

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

    在您的情况下,您希望允许用户选择每页计数。您可以将每页计数设为 URL 的一部分(即 your/page/10/),也可以将其设为查询字符串(即 your/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)
    

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

    >>> 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']
    

    【讨论】:

    • 谢谢...这正是我想要的
    • 有一点我意识到我不知道该怎么做...每页记录的设置工作正常,只是页数恢复到默认值一旦我去到第二页
    • 使用访问器方法并提供默认值,而不是 try/except :per_page = int(request.REQUEST.get('p', 25))
    【解决方案2】:

    google 上“django 分页”并确保在 SQL 中使用“覆盖索引”以进行高效查询。

    【讨论】:

      【解决方案3】:

      T。斯通的回答涵盖了我要说的大部分内容。我只想补充一点,您可以在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 以显示该页面的对象。

      【讨论】:

        【解决方案4】:

        需要什么?嗯。

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

        这将是带有获取参数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 将这些值访问到模板中。也许有更简洁的访问方法我不知道:-)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-13
          • 2011-07-28
          • 2016-03-21
          • 2011-11-13
          • 2012-12-15
          • 1970-01-01
          • 1970-01-01
          • 2012-03-04
          相关资源
          最近更新 更多