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

How can I copy CMS pages from a development site to a live site?

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

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

实时站点有必须保留的数据。所以我不能在开发站点上执行数据库级转储并在实时站点上恢复,因为这会擦除或覆盖实时站点上已经存在的数据。

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

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

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

您可以使用这些步骤:

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

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

    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
    
  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)。如果您处于 可以 安全地将它们加载到实时站点的情况下,那么将它们添加到转储可能会成功。但是,当您有一个已投入生产的实时站点并且身份验证数据随时间发生变化时,您不能只从开发站点加载身份验证模型,因为这会覆盖一些记录(例如 "admin"' s 的密码将更改为存储在开发数据库中的密码。

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

要将 CMS 页面从开发站点复制到实际站点,您可以使用 Django CMS Transferhttps://github.com/django-cms/djangocms-transfer

Django CMS Transfer 是一个允许您从页面或占位符导出和导入插件数据的包。

它非常适合简单的任务,例如从页面导出插件的内容,然后将其导入到另一个站点。 但是不支持外键关系,不会导入导出相关数据。

Django CMS 协会认可该项目。