如何使用分页显示django-cms插件

时间:2014-04-25 12:57:30

标签: django plugins pagination django-cms

我写了两个django-cms插件来显示图片库和视频。

它们附加到/gallery//videos/的CMS页面,其中每个模板都有一个占位符,允许包含相应的插件。

在我的gallery.htmlvideo.html将所有插件实例呈现到页面的基础级别,我希望能够附加endless以进行分页。

这是一个非常简单的任务,可以在图库中的图像上实现分页,因为我在apphook中有一个gallery视图来收集所有图像的列表,然后它就像{{{{}}一样简单模板中的1}}等。

然而,在django-cms控制集合的模板中,&渲染所有插件实例并且我失去了控制权,我该如何对插件进行分页?

我已经开始在{% pagingate images %} {% for image in images %}索引上使用apphook的路线了,但为了完成这个我可以想象我需要停止django-cms做它默认做的事情它应该留下什么。所以我需要一些指导/建议最好的工作方法。无论如何,这里有一些代码;

/gallery/

我目前的解决方案是一个jQuery解决方案,但我希望所有这一切都可以通过django无限的分页来控制行为和设计的一致性。

2 个答案:

答案 0 :(得分:1)

去过那儿。 Django CMS插件中的分页确实存在问题。

解决问题的一种可能方法

  1. 实现用于获取对象的分页API端点。例如,使用django.views.generic.list.ListView。它有很好的内置分页。
  2. 在CMS插件中,使用AJAX从API端点获取对象。 CMS插件不需要知道要呈现的对象,只需要知道它可以获取对象的位置(API端点)。
  3. 这种方法需要前端代码来获取正确的对象,更新UI,跟踪当前页面等等,但可以(并且已经)成功地用于实现分页的Django CMS插件。

答案 1 :(得分:0)

这是将分页添加到django cms插件中的快速解决方案

from cms.models.pagemodel import Page
from cms.plugin_base import CMSPluginBase
from django.http import Http404
from django.core.paginator import InvalidPage, Paginator


class MyPlugin(CMSPluginBase):

    def render(self, context, instance, placeholder):
        query_set = Page.objects.filter(is_page_type=False)
        page = context['request'].GET.get('page') or 1
        paginator, page, queryset, is_paginated = self.paginate_queryset(page, query_set, 6)
        context.update({'paginator': paginator,
                        'page_obj': page,
                        'is_paginated': is_paginated,
                        'object_list': queryset
                        })
        return context

    def paginate_queryset(self, page, queryset, page_size):
        paginator = Paginator(queryset, page_size)
        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)
            })