Plone 4:collective.formcriteria卸载现在可以';t导入站点

Plone 4:collective.formcriteria卸载现在可以';t导入站点,plone,python-import,buildout,Plone,Python Import,Buildout,我在一个站点上安装了collective.formcriteria,然后将其卸载并从构建中删除 当我导出网站时,它工作正常,但尝试导入网站时会出现以下错误: Traceback (innermost last): Module ZPublisher.Publish, line 127, in publish Module ZPublisher.mapply, line 77, in mapply Module ZPublisher.Publish, line 47, i

我在一个站点上安装了collective.formcriteria,然后将其卸载并从构建中删除

当我导出网站时,它工作正常,但尝试导入网站时会出现以下错误:

Traceback (innermost last):

    Module ZPublisher.Publish, line 127, in publish
    Module ZPublisher.mapply, line 77, in mapply
    Module ZPublisher.Publish, line 47, in call_object
    Module OFS.ObjectManager, line 628, in manage_importObject
    Module OFS.ObjectManager, line 646, in _importObjectFromFile
    Module ZODB.ExportImport, line 92, in importFile
    Module transaction._transaction, line 253, in savepoint
    Module transaction._transaction, line 250, in savepoint
    Module transaction._transaction, line 647, in __init__
    Module ZODB.Connection, line 1128, in savepoint
    Module ZODB.Connection, line 570, in _commit
    Module ZODB.ExportImport, line 175, in _importDuringCommit

ImportError: No module named formcriteria.criteria.relativepath
再次安装此加载项并尝试导入/导出我的站点是否有效,或者是否有其他修复程序


谢谢。

在导入期间,ZODB必须重新映射转储的pickle中的持久ID,为此,它必须“加载”导出文件中的所有条目

因此,在重新映射过程中,它将尝试导入每个引用的类。您的导出仍然包含对
collective.formcriteria
类的引用,这就是为什么在导入过程中会出现错误

您可以做两件事:

  • collective.formcriteria
    安装到您的构建中,以便此导入工作。不需要运行安装代码或任何东西,Zope进程只需要能够在导入过程中导入类。您可以在以后再次删除它

  • 用空存根填充缺少的导入。这有点复杂,因为您需要创建一个虚拟模块,将其插入到
    sys.modules
    中,以便为此过程加载

    虚拟模块可以是这样的;我把它命名为“placeholder.py”:

    from persistent import Persistent
    
    class PlaceHolderClass(Peristent):
        def __repr__(self):
            return "<Persistent placeholder class for now-removed instances>"
    
    很可能您需要根据当前的情况删除更多此类类

    使用此技术不会删除断开的引用;它只允许您将
    .zexp
    文件导入到新实例中


  • 您能否也包括日志的完整回溯?回溯:谢谢,但我很快将旧站点的内容导入了新的Plone站点(在我的工作中,我实际上不允许通过CLI访问服务器)。谢谢你的回答,不过+1,你不仅是一个专家,你还知道,如何将它以一种全面的方式传达给人们,非常感谢。
    import sys
    import placeholder
    
    sys.modules['collective.formcriteria.criteria.relativepath'] = placeholder
    
    placeholder.FormRelativePathCriterion = placeholder.PlaceHolderClass