Pagination in Wagtail

前端 未结 3 726
挽巷
挽巷 2021-02-13 04:01

I\'m fairly new to Wagtail, and I am in the process of creating a site that will have a Resources (blog) section and I\'m not sure how to implement pagination so that there are

3条回答
  •  有刺的猬
    2021-02-13 04:09

    In case it's useful to anyone, I wanted this to work as closely as possible to the class-based view ListView, and so I ended up with this:

    from django.core.paginator import Paginator, InvalidPage
    from django.http import Http404
    from django.utils.translation import gettext as _
    
    from wagtail.core.models import Page
    
    class ArticleListPage(Page):
    
        # Some Page variables set here. #
    
        # Pagination variables:
        paginator_class = Paginator
        paginate_by = 10
        page_kwarg = 'page'
        paginate_orphans = 0
        allow_empty = False
    
        def get_context(self, request):
            context = super().get_context(request)
    
            queryset = Page.objects.live()
    
            paginator, page, queryset, is_paginated = self.paginate_queryset(
                                            queryset, self.paginate_by, request)
            context.update({
                'paginator': paginator,
                'page_obj': page,
                'is_paginated': is_paginated,
                'object_list': queryset,
            })
    
            return context
    
        def paginate_queryset(self, queryset, page_size, request):
            """
            Adapted from the ListView class-based view.
            Added the request argument.
            """
            paginator = self.paginator_class(
                                        queryset,
                                        self.paginate_by,
                                        orphans=self.paginate_orphans,
                                        allow_empty_first_page=self.allow_empty)
            page_kwarg = self.page_kwarg
            page = request.GET.get(page_kwarg) or 1
    
            try:
                page_number = int(page)
            except ValueError:
                if page == 'last':
                    page_number = paginator.num_pages
                else:
                    raise Http404(_("Page is not 'last', nor can it be converted to an int."))
            try:
                page = paginator.page(page_number)
                return (paginator, page, page.object_list, page.has_other_pages())
            except InvalidPage as e:
                raise Http404(_('Invalid page (%(page_number)s): %(message)s') % {
                    'page_number': page_number,
                    'message': str(e)
                })
    

    This will give you the same paginator, page_obj, is_paginated and object_list variables in your template that you would get with a normal Django ListView.

    (Using python 3, Django 2.1 and Wagtail 2.3.)

提交回复
热议问题