如何从 Django 模板中的页面迭代 cms 插件实例?

Posted

技术标签:

【中文标题】如何从 Django 模板中的页面迭代 cms 插件实例?【英文标题】:How to iterate over cms plugin instances from a page in a Django template? 【发布时间】:2013-12-17 22:43:14 【问题描述】:

我想显示 YouTube 视频列表并让我的用户编辑此列表。

我想过这样做:

    制作一个将显示此内容的模板。在此模板中执行类似<ul>% for plugin in page %<li>plugin</li>% endfor %</ul> 的操作。 制作一个youtube_videos 占位符并将其配置为仅限于该类型的插件。

但我不知道如何对模板中当前页面中的插件实例进行此迭代。我在 django-cms 文档中没有看到任何关于此的内容,是的,我猜 django-cms “只是 django”,如果我知道 django,那么我早就知道了。

但这里有一个很好的例子。

【问题讨论】:

【参考方案1】:

您不会在 Django-CMS 中迭代插件实例。占位符只是以线性方式呈现分配给它们的插件。插件可以在占位符中拖放以重新排列它们,但据我所知,您不能在模板级别迭代插件本身,至少不容易。

要做你想做的事,你需要创建一个 CMS 插件,允许你创建一个模型的多个实例,你可以迭代,类似于“图片库”。

从概念上讲,您将拥有一个父模型:

class Gallery(CMSPlugin):
    """ A model that serves as a container for images """

    title = models.CharField(max_length=50, help_text='For reference only')

    def copy_relations(self, oldinstance):
        for slide in oldinstance.slides.all():
            slide.pk = None
            slide.gallery = self
            slide.save()

    def __unicode__(self):
        return self.title

和一个子模型:

class Slide(models.Model):
    def get_upload_to(instance, filename):
        return 'galleries/slug/filename'.format(
            slug=slugify(instance.gallery.title), filename=filename)

    title = models.CharField(max_length=100)
    image = models.ImageField(upload_to=get_upload_to)
    alt = models.CharField(max_length=100)
    gallery = SortableForeignKey(Gallery, related_name='slides')

    def __unicode__(self):
        return self.title

那么您将拥有一个像这样的 CMS 插件:

class CMSGalleryPlugin(CMSPluginBase):
    admin_preview = False
    inlines = Slide
    model = Gallery
    name = _('Gallery')
    render_template = 'gallery/gallery.html'

    def render(self, context, instance, placeholder):
        context.update(
            'gallery': instance,
            'placeholder': placeholder
        )
        return context

plugin_pool.register_plugin(CMSGalleryPlugin)

最后是遍历幻灯片图像的模板:

% for slide in gallery.slides.all %
    <img src=" slide.image.url "  />
% endfor %

【讨论】:

以上是关于如何从 Django 模板中的页面迭代 cms 插件实例?的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.11 如何从保存在 CMS 站点模型中的 HTML 中显示模板变量

显示相同占位符内容的 Django-CMS apphook 模板

Django,如何将变量从 Django 管理员传递到模板?

从祖先继承的 Django CMS 模板不识别占位符

使用 django-page-cms 显示页面内容

在不同的占位符/模板上以不同的方式呈现 Django-CMS 插件