如何将 CMS 页面从开发站点复制到实时站点?

Lou*_*uis 2 python django django-cms

我一直在将 Django CMS 集成到一个已经投入生产一年多的 Django 项目中。作为我的开发活动的一部分,我已将那些在添加 Django CMS 之前曾经是静态内容的页面转换为 CMS 页面。我的开发数据库现在包含我想要复制到实时站点的页面,而不是要求项目人员在实时站点上重新创建这些页面。

我搜索了 Django CMS 文档,但没有找到此命令。我还搜索了 github 上的问题、SO 上的问题和 Django CMS google 组。我发现的唯一一件事是3 年前的讨论。讨论中提到使用dumpdata转储cms模型。我试过了。转储包含有关页面的信息(例如,谁创建了页面以及何时创建),但它不包含页面的内容

实时站点具有必须保留的数据。因此,我无法在开发站点上执行数据库级转储并在实时站点上进行还原,因为这会擦除或覆盖实时站点上已存在的数据。

我正在使用 Django 1.7 和 Django CMS 3.1.0。

Lou*_*uis 5

您所指的讨论早于 3.x 系列。也许dumpdata为与cms应用程序关联的模型做 a3 年前的方法,但是,正如您发现的那样,它现在不起作用。

我实际上建议在您的实时站点的镜像上尝试以下步骤,以便在实际操作之前处理任何意外。如果您在镜子上遇到麻烦,您可以花时间解决问题。一旦您准备好修改您的实时站点,在您做任何事情之前,您应该备份您的数据库。安全总比后悔好。此外,您尝试移动数据之前,应更新站点上的代码库以反映您的开发版本。

您可以使用以下步骤:

  1. 检查您的INSTALLED_APPS设置并列出作为 CMS 插件的应用程序以及这些插件所依赖的应用程序。你可能需要查阅一些插件的安装说明来回忆什么取决于什么。

    获得列表后,您可以dumpdata在开发站点上使用cms您确定的应用程序发出命令。对于我的网站,我必须这样做:

    python manage.py dumpdata --natural-foreign cms filer \
      cmsplugin_filer_file cmsplugin_filer_folder cmsplugin_filer_link \
      cmsplugin_filer_image cmsplugin_filer_teaser cmsplugin_filer_video  \
      easy_thumbnails djangocms_text_ckeditor > data.json
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您还为 Django CMS 创建了自定义权限设置,则可能需要进行编辑data.json删除部分或全部自定义设置。就我而言,我有一个cms.PageUserGroup在我的开发站点上创建的实例。它引用了一个在实时站点上不存在的组,所以我不得不从data.json转储中删除这个实例。否则,loaddata下一步中的命令将因完整性错误而失败。

  3. 然后您复制data.json到您的实时站点并发布python manage.py loaddata data.json.

  4. 如果您已将任何文件添加到media开发站点的目录中以创建 CMS 页面,则还需要将它们复制到您的实时站点。

我已经使用上述过程将数据从我的开发站点移动到实时站点,没有明显的问题。

注意事项

  1. 上述程序是一次性交易。如果您继续对开发页面进行更改,然后尝试将它们迁移到您的实时站点,这将不起作用。

  2. 我在上面的步骤中提到了权限问题。如果您已CMS_PERMISSIONS设置为 ,则最不可能遇到权限问题False。如果设置为True,则您可能必须按照上述说明编辑转储,然后再将其加载到实时站点上。如果您对权限方案进行了大量定制,并且拥有一大堆PageUserGroup实例和一堆具有特殊权限的页面等,那么您很可能会遇到重大困难。除了撤消所有这些自定义手动编辑转储以使其与您的实时站点相匹配之外,我不知道有什么解决方案。问题是由于上述过程没有转储(的django.contrib.auth)身份验证模型这一事实。如果您处于以下情况可以将它们安全地加载到实时站点上,然后将它们添加到转储中可能会成功。但是,当您有一个已投入生产且身份验证数据随时间更改的实时站点时,您不能仅从开发站点加载身份验证模型,因为这会覆盖某些记录(例如“管理员”的密码)将更改为存储在开发数据库中的那个)。

  3. 上述方法不会移动任何页面的历史记录。它用 记录reversion。如果您想移动页面的历史记录,则必须添加reversion到要转储的应用程序列表中,但我很确定它可能会产生不良副作用:它还可能影响其他使用的应用程序的还原记录数据它在项目中。(实际上,它会更改或删除其他应用程序的历史记录。)