【发布时间】:2016-02-14 16:02:16
【问题描述】:
我有一个关于 Django 基于类的视图方法get_context_data() 的快速逻辑问题。
假设我有一个基于 分页 类的 ListView。它每页显示 20 个对象,整个查询集中有 200 个对象。
我的问题是:
我如何仅遍历context["object_list"] 中属于当前页面的那些对象?
【问题讨论】:
标签: python django pagination django-queryset
我有一个关于 Django 基于类的视图方法get_context_data() 的快速逻辑问题。
假设我有一个基于 分页 类的 ListView。它每页显示 20 个对象,整个查询集中有 200 个对象。
我的问题是:
我如何仅遍历context["object_list"] 中属于当前页面的那些对象?
【问题讨论】:
标签: python django pagination django-queryset
使用基于类的视图非常简单。
在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
【讨论】:
paginate_by = 20(或任何#),剩下的就是'魔术'。传递给模板的 object_list 应该只包含当前页面的对象,并且所有的分页变量(is_paginated、page_obj)也被添加到上下文中。
object_list?如果是这样,那可能会导致问题。
views.py - github.com/mfcovington/django-system-maintenance/blob/develop/… 和模板 - github.com/mfcovington/django-system-maintenance/blob/develop/…(它有一些额外的类,因为我使用的是引导程序)