我正在关注a tutorial关于操纵灵巧内容对象的问题。它解释了如何创建对象。
from zope.component import createObject
context = createObject('example.type')
但我不确定要放什么example.type
。我尝试使用IProduct
,degu.product.IProduct
和degu.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')
答案 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)