Skip to main content
 首页 » 编程设计

python之如何在 Django 中基于类的分页 View 中迭代当前页面中的对象

2024年08月23日34jackei

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

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

我的问题是:

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

请您参考如下方法:

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

在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 的文档.

更新:

由于您正在处理对象列表,因此在您的 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