如何将基于类的视图变量转换为基于函数的视图?

时间:2019-06-07 18:00:44

标签: python django

在基于类的视图中,我只能执行“ 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了?

1 个答案:

答案 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用来分页结果的方式。但是以上内容实际上已经在某种程度上表明,对于此类视图,最好使用基于类的视图,以便可以删除样板代码。