以编程方式将一个 django CMS 插件替换为另一个

2024-01-10

我有一个网站,其中有许多指向 YouTube 的 Filer Video 插件。我发现该文件管理器不太适合响应式网站(它需要固定宽度),因此我没有修复它,而是编写了自己的简单小插件,可以轻松地为可变宽度布局嵌入 YouTube。

所以现在我有很多cmsplugin_filer_video.models.FilerVideo我想用我的实例替换cmsyoutube.models.YtVideo实例。循环它们很好,但是我如何以编程方式取出一个插件并将其(就地)替换为另一个插件?

仔细想想,它们[最终]都是基于 CMSPlugin 的。我可以将父项目转移到我的新课程中吗?


这是我到目前为止所了解到的。迭代旧视频并尝试创建新视频YtVideo(同样的事情)在删除旧的之前指向同一个 cmsplugin_ptrFilerVideo v...

for v in FilerVideo.objects.all():
    plugin = v.cmsplugin_ptr
    v.cmsplugin_ptr_id = None
    new = YtVideo()
    new.cmsplugin_ptr = plugin
    plugin.plugin_type = 'YoutubePlugin'
    new.youtube_id = re.search(r'v=([^&]+)', v.movie_url).groups(0)[0]
    new.thumbnail = v.image
    new.save()
    plugin.save()
    v.delete()

但 TreeBeard 对此感到非常沮丧:

NodeAlreadySaved: Attempted to add a tree node that is already in the database

看起来那里有一些级联保存逻辑。知道如何热连它,以便我可以替换插件实例而不破坏底层CMSPlugin tree?


有更多的运气cms.api.add_plugin。有趣的是我无法坚持下去。我认为它需要飘逸的“最后一个孩子”风格的英语而不是数字输入。所以我只是在第二次之后钉它add_plugin.

from cms import api
for v in FilerVideo.objects.all():
    youtube_id = re.search(r'v=([^&]+)', v.movie_url).groups(0)[0]
    position = v.position
    v.delete()
    new = api.add_plugin(v.placeholder, 'YoutubePlugin', v.language, position, v.parent, youtube_id=youtube_id, thumbnail=v.image)
    new.position = position
    new.save()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式将一个 django CMS 插件替换为另一个 的相关文章

随机推荐