Django CMS如何以编程方式创建嵌套插件

时间:2015-01-14 07:04:04

标签: python django hyperlink content-management-system ckeditor

我正在编写一个迁移脚本来将旧的html网站解析为Django CMS页面。 我需要的是了解如何以编程方式嵌套插件。 在特殊情况下,我需要html <一个> 标记转换为CMS LinkPlugin对象,嵌套在由Django-CMS的标准ckeditor TextPlugin编辑的文本中。

如何以编程方式将插件嵌套在Django CMS的其他插件中。在我的情况下,我需要在文本中的TextPlugin中嵌套CMS链接插件。 我知道如何解析文本。从嵌套的CMS插件角度来看,我不明白如何做到这一点? 我无法将我插入到祖先TextPlugin中的Link CMS插件对象实例和CMSPlugin对象实例互连。

更多背景信息:

注意我真的知道如何从UI角度来做这件事。我需要在脚本中模拟这个。 我已经将数据库转储到JSON中,并注意到那里有某些东西。

首先,我有一个放置在页面占位符中的CMSPlugin类实例。 (从CMS的 placeholderadmin.py 中选择此部分)

            position = CMSPlugin.objects.filter(language=lang, parent=parent).count()
            plugin = CMSPlugin(
                language='en',
                position=position,
                plugin_type=plugin_type,
                placeholder=placeholder,
            )
            plugin.insert_at(parent, position='last-child', save=False)
            plugin.save()

            # ?????
            plugin.link = Link(
                name='Link text',
                page_link=target_page,
                placeholder=placeholder,
            )
            plugin.save()

这会在适当的占位符中创建一个嵌套插件,并将其附加到文本插件中。但是它添加了一个空白的LinkPlugin实例。我稍后在CMS中创建了一个Link插件的实例。 事情是我不知道如何正确地做到这一点。

从UI角度来看,CMS插件是嵌套添加的,但不包含真正的插件实例。因此,该占位符的Admin插件树使用空的Link插件呈现。 Here how it looks CMSPlugins已添加链接 <空> 即可。

我可以通过管理员编辑这个创建的链接插件,并添加文本和目标链接。如何以编程方式执行此操作。例如。在脚本里面?脚本必须执行1000页的页面,所以我不能手动完成

3 个答案:

答案 0 :(得分:3)

很抱歉只是为了保持一致。看起来这在逻辑上要复杂得多。 我做了一篇关于此的文章。

Django CMS Adding plugins inside plugins programmatically

一般来说,解决方案是模仿CMS的方式。

    # Getting an site admin instance
    admin_site = AdminSite()

    instance, plugin_admin = plugin.get_plugin_instance(admin_site)
    plugin_admin.cms_plugin_instance = plugin
    plugin_admin.placeholder = plugin.placeholder

    # Triggering the Django Admin add view with our request.
    # That's how Django-CMS does this action itself.
    response = plugin_admin.add_view(request)

在文章中查找完整代码段。希望这可以帮助有类似问题的人。

答案 1 :(得分:2)

要添加嵌套插件,您需要执行以下操作:

        add_plugin(
            placeholder=placeholder,
            plugin_type='TextPlugin',
            language=translation.get_language(),
        )

        target = placeholder.get_plugins().get(plugin_type='TextPlugin')

        add_plugin(
            placeholder=placeholder, #same placeholder as the parent plugin
            plugin_type='LinkPlugin',
            language=translation.get_language(),
            target=target, #the parent plugin
            #here comes the params from the selected plugin
            name='Google',
            url='http://www.google.com'
        )

这也适用于自定义插件。

答案 2 :(得分:1)

您是否尝试过保存已创建的链接插件?

plugin.link = Link(
            name='Link text',
            page_link=target_page,
            placeholder=placeholder,
        )

也许会尝试添加

plugin.link.save()

我希望是这样的。