我的网站上有许多指向YouTube的Filer视频插件。我已经确定文件管理器对于响应式网站(它需要固定的宽度)并不是很好,所以我没有修复它,而是编写了我自己的简单的小插件,这个插件很容易嵌入到变量中 - 宽度布局。
所以现在我有大量的cmsplugin_filer_video.models.FilerVideo
个实例要用我的cmsyoutube.models.YtVideo
实例替换。循环使用它们很好,但我如何以编程方式取出一个插件并将其替换为另一个插件?
大声思考,他们[最终]都基于CMSPlugin。我可以将父项转置到我的新课程中吗?
到目前为止,这是我所得到的。迭代旧视频并尝试创建一个新的YtVideo
(相同的东西),指向相同的cmsplugin_ptr,然后删除旧的FilerVideo 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
看起来那里有一些级联保存逻辑。任何想法如何hotwire这样我可以替换插件实例而不破坏底层的CMSPlugin
树?
答案 0 :(得分:0)
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()