在基于类的视图中,我只能执行“ paginate_by = 8”,而在html中,我可以这样做
{% if page_obj.has_previous %}
<a class="btn btn-outline-info mb-4" href="?page=1">First</a>
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous</a>
{% endif %}
但是对于基于函数的视图,有什么我可以做的事情,例如paginate_by,这样我就不必从已有的内容中修改html了?
答案 0 :(得分:1)
是的,您可以自己实现pagination [Django-doc],例如:
from app.models import SomeModel
from django.core.paginator import Paginator
from django.http import Http404
from django.shortcuts import render
def some_view(request):
paginate_by = 8
qs = SomeModel.objects.all()
page = request.GET.get('page') or 1
try:
page = int(page)
except ValueError:
raise Http404('Invalid page number')
paginator = Paginator(qs, paginate_by)
try:
page = paginator.page(page)
except InvalidPage as e:
raise Http404('Invalid page number')
return render(
request,
'some_template.html',
{'page_obj': page, 'object_list': page.object_list}
)
因此,我们在这里使用Paginator
[Django-doc]对象对查询集进行分页。
这或多或少是MultipleObjectMixin
用来分页结果的方式。但是以上内容实际上已经在某种程度上表明,对于此类视图,最好使用基于类的视图,以便可以删除样板代码。