【发布时间】:2014-06-11 05:04:44
【问题描述】:
我写了两个 django-cms 插件来显示图片库和视频。
这些附件在 /gallery/ 和 /videos/ 的 CMS 页面上,其中每个模板都有一个占位符,允许包含相应的插件。
在我有gallery.html 和video.html 将所有插件实例呈现到页面的基础级别,我希望能够附加endless 进行分页。
这是一项非常简单的任务,可以在图库中对图像进行分页,因为我在 gallery 中有一个 apphook 视图来收集所有图像的列表,然后就像 {% pagingate images %} {% for image in images %} 等一样简单模板。
但是,在 django-cms 控制所有插件实例的收集和渲染的模板中,我失去了控制,如何对插件进行分页?
我已经开始在/gallery/ 索引上使用apphook 的路线,但要完成这一点,我可以想象我需要停止 django-cms 执行它默认执行的操作以及应该执行的操作剩下要做的。所以我需要一些关于工作的最佳方法的指导/建议。不管怎样,这里有一些代码;
# views.py
def gallery_index(request, *args, **kwargs):
template = request.current_page.template
placeholder_id = request.current_page.placeholders.get(slot='gallery').id
gallery = Placeholder.objects.get(id=placeholder_id)
galleries = gallery.cmsplugin_set.all()
return render_to_response(
template,
{'galleries': galleries},
context_instance=RequestContext(request)
)
# gallery.html
<h3>GALLERIES</h3>
<div id="panel-area" class="gallery_grid">
<ul id="galleries" class="gridview" style="width: 800px;">
{% paginate galleries %}
{% for gallery in galleries %}
<li>{{ gallery }}</li> <!-- testing the pagination -->
{% endfor %}
{% placeholder "gallery" %}
</ul>
{% show_pages %}
# cms_plugins.py
class ImageGalleryPlugin(CMSPluginBase):
name = _('Image Gallery')
model = ImageGalleryPlugin
form = ImageGalleryAdminForm
render_template = 'single_gallery.html'
def render(self, context, instance, placeholder):
context.update({'gallery': instance,})
return context
# single_gallery.html
<li class="gallery_top">
<span class="title">
<a href="{% url 'image_gallery_page' page_id=request.current_page.id gallery_id=gallery.id %}">{{ gallery.event_date|date:"d/m/Y" }}<br/>
<p class="sub-text">View more of {{ gallery.event_name }}</p></a>
</span>
<img src="{{ gallery.display_random.gallery_display }}" alt="" border="0" />
</li>
我当前的解决方案是 jQuery 解决方案,但我希望这一切都由 django 无休止的分页控制,以保持行为和设计的一致性。
【问题讨论】:
-
django.contrib.pagination 需要访问 GET 变量,例如 URL 上的“page”。因此,不建议在 djangoCMS 插件的上下文中进行分页:如果您的用户在同一页面上安装了两个分页插件怎么办?如果页面上的主要内容(非插件)是分页的怎么办?会出现混乱!我想,您可以在每个插件的基础上覆盖 GET var 名称,但是如果您的用户在页面上多次安装同一个插件,这仍然无济于事。
-
如果您希望使用 CMS 应用程序来执行此操作,那就太好了!一定要在这里阅读这个主题:docs.djangoproject.com/en/dev/topics/pagination 另外,你应该知道 Django 中的基于类的视图系统内置了对分页的支持。在这里查看:ccbv.co.uk/projects/Django/1.6/django.views.generic.list/…
-
谢谢@mkoistinen。我很高兴采用“它违背插件的理想”的思维方式,但我认为如果用户想要在一个页面中有很多实例,那么将它作为管理员中的一个选项会很好(这对于图片画廊的页面当然是可能的)。
标签: django plugins pagination django-cms