【问题标题】:Programmatically replace one django CMS plugin with another以编程方式将一个 django CMS 插件替换为另一个
【发布时间】: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


    【解决方案1】:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      相关资源
      最近更新 更多