如何在Django中基于类的分页视图中迭代当前页面中的对象?

时间:2015-11-13 05:33:23

标签: python django pagination django-queryset

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

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

我的问题是:

如何迭代 当前页context["object_list"] 的那些对象?

1 个答案:

答案 0 :(得分:2)

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

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