尝试创建新的灵巧对象时的ComponentLookupError

时间:2013-03-03 03:13:51

标签: plone dexterity

我正在关注a tutorial关于操纵灵巧内容对象的问题。它解释了如何创建对象。

from zope.component import createObject
context = createObject('example.type')

但我不确定要放什么example.type。我尝试使用IProductdegu.product.IProductdegu.Product。但是所有这些都引发了ComponentLookupError。

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/daniel/.buildout/eggs/zope.component-3.9.5-py2.6.egg/zope/component/_api.py", line 220, in createObject
    return getUtility(IFactory, __factory_name, context)(*args, **kwargs)
  File "/home/daniel/.buildout/eggs/zope.component-3.9.5-py2.6.egg/zope/component/_api.py", line 169, in getUtility
    raise ComponentLookupError(interface, name)
ComponentLookupError: (<InterfaceClass zope.component.interfaces.IFactory>, 'degu.commerce.product.IProduct')

1 个答案:

答案 0 :(得分:4)

您需要使用与Dexterity FTI registration中使用的名称相同的名称。

您可以验证portal_types工具中注册的名称:

from Products.CMFCore.utils import getToolByName

typestool = getToolByName(context, 'portal_types')
print typestool.listContentTypes()

或访问浏览器中ZMI中的portal_types工具,查看其中的类型列表;它们在工具中列为typeid (Type Title)。如果未列出您的类型,请确保您首先正确注册了您的类型。

请注意,要使其正常工作,您需要正确设置本地组件管理器。通常,这会自动发生,但如果您使用bin/instance run脚本或使用bin/instance debug,则不会发生这种情况。在这种情况下,您需要手动执行此操作:

from zope.app.component.hooks import setSite
from Testing.makerequest import makerequest

app = makerequest(app)
site = app[site_id]
setSite(site)

您可能还想设置当前用户:

from AccessControl.SecurityManagement import newSecurityManager

user = app.acl_users.getUser('admin').__of__(site.acl_users)
newSecurityManager(None, user)