【问题标题】:How to iterate over objects in current page in class-based paginated view in Django?如何在Django中基于类的分页视图中迭代当前页面中的对象?
【发布时间】:2016-02-14 16:02:16
【问题描述】:

我有一个关于 Django 基于类的视图方法get_context_data() 的快速逻辑问题。

假设我有一个基于 分页 类的 ListView。它每页显示 20 个对象,整个查询集中有 200 个对象。

我的问题是:

我如何遍历context["object_list"] 中属于当前页面的那些对象?

【问题讨论】:

    标签: python django pagination django-queryset


    【解决方案1】:

    使用基于类的视图非常简单。

    views.py:

    from django.views.generic import ListView
    
    
    class YourPaginatedListView(ListView):
        ...
        paginate_by = 20
    

    在您的模板中,此版本的某些版本:

     {% if is_paginated %}
      <nav>
        <ul>
    
          <li>
            <a href="{% if page_obj.has_previous %}?page=1{% endif %}">
              First Page
            </a>
          </li>
    
          <li>
            <a href="{% if page_obj.has_previous %}?page={{ page_obj.previous_page_number }}{% endif %}">
              Previous Page
            </a>
          </li>
    
          <li>
            <a>{{ page_obj.number }} / {{ page_obj.paginator.num_pages }}</a>
          </li>
    
          <li>
            <a href="{% if page_obj.has_next %}?page={{ page_obj.next_page_number }}{% endif %}">
              Next Page
            </a>
          </li>
    
          <li>
            <a href="{% if page_obj.has_next %}?page={{ page_obj.paginator.num_pages }}{% endif %}">
              Last Page
            </a>
          </li>
    
        </ul>
      </nav>
    {% endif %}
    

    如果您不使用 CBV,请查看Using Paginator in a view 的文档。

    更新:

    由于您正在处理对象列表,请在您的视图中尝试这样的操作以仅处理当前页面上的对象:

    from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
    
    from .models import YourModel
    
    
    class YourPaginatedListView(ListView):
        ...
        paginate_by = 20
    
        def get_context_data(self, **kwargs):
    
            context = super(YourPaginatedListView, self).get_context_data(**kwargs) 
            object_list = YourModel.objects.all()
    
            paginator = Paginator(object_list, self.paginate_by)
            page = self.request.GET.get('page')
    
            try:
                current_objects = paginator.page(page)
            except PageNotAnInteger:
                current_objects = paginator.page(1)
            except EmptyPage:
                current_objects = paginator.page(paginator.num_pages)
    
            # Process the objects on the current page here
    
            context['object_list'] = current_objects
            return context
    

    【讨论】:

    • 我正在使用 CBV。那么是否有我可以直接在视图中实现的解决方案,例如在 get_context_data() 什么的?
    • 所有你需要做的就是添加paginate_by = 20(或任何#),剩下的就是'魔术'。传递给模板的 object_list 应该只包含当前页面的对象,并且所有的分页变量(is_paginatedpage_obj)也被添加到上下文中。
    • 您是否手动覆盖object_list?如果是这样,那可能会导致问题。
    • 这是我最近写的一个工作示例:views.py - github.com/mfcovington/django-system-maintenance/blob/develop/… 和模板 - github.com/mfcovington/django-system-maintenance/blob/develop/…(它有一些额外的类,因为我使用的是引导程序)
    • 更新了一个可能的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2023-01-09
    • 1970-01-01
    • 2020-09-04
    相关资源
    最近更新 更多