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

时间:2015-06-02 17:44:37

标签: python django django-cms

我一直在将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。

1 个答案:

答案 0 :(得分:3)

您所参考的讨论早于3.x系列。对于与dumpdata应用程序相关联的模型而言,为cms执行是 3年前的方法,但是,正如您所发现的那样,它现在不起作用。

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

您可以使用以下步骤:

  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
    
  2. 如果您还为Django CMS创建了自定义权限设置,可能需要编辑data.json删除部分或全部自定义设置。就我而言,我在我的开发站点上创建了一个cms.PageUserGroup实例。它引用了一个在实际站点上不存在的组,因此我不得不从data.json转储中删除此实例。否则,下一步中的loaddata命令会因完整性错误而失败。

  3. 然后,您将data.json复制到您的实际网站并发布python manage.py loaddata data.json

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

  5. 我已经使用上述程序将数据从我的开发网站移动到实际网站,没有明显的问题。

    注意事项

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

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

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