我写了两个django-cms插件来显示图片库和视频。
它们附加到/gallery/
和/videos/
的CMS页面,其中每个模板都有一个占位符,允许包含相应的插件。
在我的gallery.html
和video.html
将所有插件实例呈现到页面的基础级别,我希望能够附加endless
以进行分页。
这是一个非常简单的任务,可以在图库中的图像上实现分页,因为我在apphook
中有一个gallery
视图来收集所有图像的列表,然后它就像{{{{}}一样简单模板中的1}}等。
然而,在django-cms控制集合的模板中,&渲染所有插件实例并且我失去了控制权,我该如何对插件进行分页?
我已经开始在{% pagingate images %} {% for image in images %}
索引上使用apphook
的路线了,但为了完成这个我可以想象我需要停止django-cms做它默认做的事情它应该留下什么。所以我需要一些指导/建议最好的工作方法。无论如何,这里有一些代码;
/gallery/
我目前的解决方案是一个jQuery解决方案,但我希望所有这一切都可以通过django无限的分页来控制行为和设计的一致性。
答案 0 :(得分:1)
去过那儿。 Django CMS插件中的分页确实存在问题。
解决问题的一种可能方法
django.views.generic.list.ListView
。它有很好的内置分页。这种方法需要前端代码来获取正确的对象,更新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)
})