gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:48:52 25 4
gpt4 key购买 nike

我有一个网站,其中包含许多指向 YouTube 的 Filer Video 插件。我认为 filer 不太适合响应式网站(它需要固定宽度),所以我没有修复它,而是编写了我自己的简单小插件,它可以非常轻松地嵌入 YouTube 以实现可变宽度布局。

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

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


这就是我到目前为止所得到的。迭代旧视频并尝试创建一个新的 YtVideo(相同的东西),在删除旧的 FilerVideo v 之前指向相同的 cmsplugin_ptr ...

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 树的情况下替换插件实例吗?

最佳答案

使用 cms.api.add_plugin 运气更好。有趣的是我无法坚持下去。我认为它期望的是飘忽不定的“last-child”式英语,而不是数字输入。所以我只是在 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()

关于django - 以编程方式将一个 Django CMS 插件替换为另一个插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31142424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com