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

时间:2013-12-02 09:18:40

标签: django for-loop django-templates iteration django-cms

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

我想这样做:

  1. 制作一个模板,显示该模板。在此模板中执行<ul>{% for plugin in page %}<li>plugin</li>{% endfor %}</ul>
  2. 之类的操作
  3. 制作一个youtube_videos占位符,并将其配置为仅限于该类型的插件。
  4. 但我不知道如何对模板中当前页面中的插件实例进行此迭代。我在django-cms文档中没有看到任何关于此的内容,是的,我猜django-cms“只是django”,如果我已经知道了django,那么我已经想到了这个。

    但是这里一个很好的例子会很好。

1 个答案:

答案 0 :(得分:2)

您不会在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 }}" alt="{{ slide.alt }}" />
{% endfor %}