【发布时间】:2015-09-17 11:52:50
【问题描述】:
我有一个网站,其中包含许多指向 YouTube 的 Filer Video 插件。我认为文件管理器对于响应式网站不是很好(它需要固定宽度),所以我没有修复它,而是编写了自己的简单小插件,它可以很容易地嵌入 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 树的情况下替换插件实例?
【问题讨论】:
标签: django django-cms