当我刷新页面时,我的自定义 Django CMS 插件的子项变得无效

When I refresh the page, my custom Django CMS plugin's children become invalid

我已经编写了最简单的允许儿童使用的 Django CMS 插件(我使用 Python 3.4.3、Django 1.7.10、Django CMS 3.1.3):

cms_plugins.py:

from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool

class SamplePlugin(CMSPluginBase):
    allow_children = True
    render_template = "sample_plugin.html"

    def render(self, context, instance, placeholder):
        context['instance'] = instance
        return context

plugin_pool.register_plugin(SamplePlugin)

templates/sample_plugin.html:

{% load cms_tags %}

{% for plugin in instance.child_plugins %}{% render_plugin plugin %}{% endfor %}

我不使用自定义模型,只渲染子插件。

然后我在结构模式下打开了一个页面,并将该 Sampe 插件的一个实例和一个样式插件添加到一个占位符 - 到目前为止,一切顺利。我可以编辑两者,当然我自己的插件没有太多可编辑的。当我现在将 Style Plugin 移动到我的示例插件中时,我仍然可以编辑 Style Plugin。切换到内容模式并检查 DOM,插件确实是嵌套的。

但是,如果我现在刷新页面,显然不一致:

快速检查 djangocms_style 没有发现任何与问题相关的明显差异。这是怎么回事?


我也得到类似于 these 的堆栈跟踪,但它们似乎无关 - 添加任何插件时都会发生这种情况 - 并且不会破坏其他任何东西 - 没有 503 或任何东西。

问题好像出在模板上,应该是

{% for plugin in instance.child_plugin_instances %}

如果

{% for plugin in instance.child_plugins %}

这似乎在 Django CMS 2.4 和 3.0 之间发生了变化:比较 2.4 and 3.0 上的信息(查看 parent.html

我发现没有必要覆盖 render 来添加 context['instance'];样式插件也不这样做。