1

我有一个有几个类的老式产品。在课堂上,我已经定义了 meta_type 并且我也将它们注册在 中__init__.py,即:

def initialize(context):
    context.registerClass(
        ClassA.ClassA,
        permission = "Add ClassA",
        constructors = (ClassA.manage_addClassA,
                        ClassA.manage_addClassA),
        icon = 'www/images/ClassA.gif'
    )

在我将 Zope 从 2.9 更新到 2.13 之前,这一直很好。现在在 zmi 中,在“添加产品”下拉列表中,这些 meta_types 每次显示两次。

我试图追踪这个错误的来源:

  1. ObjectManager.py,filtered_meta_types
  2. ObjectManager.py, all_meta_types
  3. getattr(产品,'meta_types',())

现在我不知道下一步该往哪里看 :)

这只是一个麻烦,它不会对产品的功能造成任何问题。也许我应该将它更新为一种新型的 zope 产品,但我很好奇这个错误是从哪里来的。

4

1 回答 1

1

您需要<five:registerPackage />从文件中删除您的注册configure.zcml,因为您的旧包正在使用Products.命名空间。

Products.命名空间一直是自动加载的;该initialize(context)函数是为该命名空间隐式加载的,因为在它是官方命名空间之前。

然而,当 Zope 开始支持命名空间之外的包Products.时,决定(明智地)改为显式注册,并且<five:registerPackage />引入了允许您在仍然需要旧注册钩子时使用它。

但是,在您的情况下,这意味着您的initialize()函数被调用了两次;一次是因为它是一个Products.包,一次是因为您明确注册了它。

于 2013-02-06T14:12:14.353 回答