Django-CMS 自定义插件未在已发布页面中显示数据

Posted

技术标签:

【中文标题】Django-CMS 自定义插件未在已发布页面中显示数据【英文标题】:Django-CMS custom plugin not showing data in published pages 【发布时间】:2017-03-20 15:09:11 【问题描述】:

我在 Django/Django-CMS 中为我​​的项目创建了一个自定义插件,该插件有一个用户在将插件添加到页面时选择的推荐列表。型号是这样的:

class TestimonialsPlugin(CMSPlugin):
    n_testimonials = models.PositiveIntegerField(
        verbose_name=_('Number of Testimonials'), default=5)

    speed_autoplay = models.PositiveIntegerField(
        verbose_name=_('Speed of slider (milliseconds)'), default=3000)

    picked_testimonials = models.ManyToManyField(Testimonials,
                                                 verbose_name=_('picked_testimonials'),
                                                 blank=True, null=True)

在编辑模式下,我可以在我的页面中设置推荐,并且我可以毫无错误地发布,但是当我看到已发布的页面时,推荐没有显示。插件模板正在呈现,但pick_testimonials 给出了None。这是模板:

<div class="max-width1440 block clearfix relative">
    <div class="small-only-text-left small-12 small-offset-0 medium-text-center medium-offset-1 medium-10 large-offset-1 large-10 column pt-px60 pb-px40 pl-px40 pr-px40 slider-testimonials">
        % for testimonial in instance.picked_testimonials.all %
            % if forloop.counter0 < instance.n_testimonials %
                <div class="slider column">
                    <blockquote class="acta_mediumitalic size36 pl-px80 pr-px80 line-height140">
                        % render_model testimonial "description" %
                    </blockquote>

                    <div class="mt-px30">
                        <p class="acta_book size20 softblack"> testimonial.author ,<span> testimonial.city </span>
                        </p>
                    </div>
                </div>

            % endif %
        % endfor %
    </div>
</div>

【问题讨论】:

【参考方案1】:

当页面发布时,会创建一个插件的副本——其中包含插件的字段但不包含任何关系。 CMS 中有一条规定为此目的提供复制方法,参见documentation 中的示例:

class ArticlePluginModel(CMSPlugin):
    title = models.CharField(max_length=50)
    sections = models.ManyToManyField(Section)

    def copy_relations(self, oldinstance):
        self.sections = oldinstance.sections.all()

重要的一点是copy_relations,它确保新对象具有相同的关系链接。

在你的情况下,这些方面的东西应该可以工作:

class TestimonialsPlugin(CMSPlugin):
    n_testimonials = models.PositiveIntegerField(
        verbose_name=_('Number of Testimonials'), default=5)

    speed_autoplay = models.PositiveIntegerField(
        verbose_name=_('Speed of slider (milliseconds)'), default=3000)

    picked_testimonials = models.ManyToManyField(Testimonials,
                                                 verbose_name=_('picked_testimonials'),
                                                 blank=True, null=True)

    def copy_relations(self, oldinstance):
        self.picked_testimonials = oldinstance.picked_testimonials.all()

【讨论】:

很高兴我能提供帮助并享受使用 Django CMS 的工作!

以上是关于Django-CMS 自定义插件未在已发布页面中显示数据的主要内容,如果未能解决你的问题,请参考以下文章

Django-cms Placeholderfield 不工作,抛出 lambda 异常

未在已安装的钩子中定义的方法,Vue JS

Django CMS 插件自定义模板

将自定义占位符添加到 django-cms

Sharepoint 自定义列表代码隐藏未在嵌入页面上调用

Flutter:未在已发布的应用程序中收集