我有一个关于Django基于类的视图方法get_context_data()
的快速逻辑问题。
想象一下,我有一个分页基于类的ListView。它每页显示20个对象,整个查询集中有200个对象。
我的问题是:
如何迭代 当前页中context["object_list"]
中 的那些对象?
答案 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