我正在编写一个迁移脚本来将旧的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插件呈现。 CMSPlugins已添加链接 <空> 即可。
我可以通过管理员编辑这个创建的链接插件,并添加文本和目标链接。如何以编程方式执行此操作。例如。在脚本里面?脚本必须执行1000页的页面,所以我不能手动完成
答案 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()
我希望是这样的。