我一直在尝试使用 Dexterity 工具在我的 plone 站点中创建内容createContentInContainer
。
我编写了一个在我的 zopepy 实例下运行的脚本,它完成了以下任务:
- 从 SQL 表中选择数据。
- 创建一个反映我的产品中定义的自定义内容类型的元组列表。
我知道我的方法非常天真,但我通过以下方式创建了与应用程序数据库的连接:
storage = FileStorage.FileStorage('.../var/filestorage/Data.fs')
db = DB(storage)
conn = db.open()
dbroot = conn.root()
我正在尝试通过以下方式创建内容:
createContentInContainer(dbroot['Application']['myapp']['existingfolder'], portal_type, checkConstraints=False, content=item)
portal_type
以前设置为我的自定义内容类型。item
既是传递给内容接口(引发Could not adapt
TypeError)的元组列表,也是从接口继承的未注册适配器。
该类型的接口在mysite.Widget.xml
in 中注册profiles/defualt/types
,但脚本不断抛出:
Traceback (most recent call last):
File "./bin/zopepy", line 345, in <module>
execfile(__file__)
File "importdex.py", line 105, in <module>
createContentInContainer(dbroot['Application']['myapp']['existingfolder'], portal_type, checkConstraints=False, content=item)
File "env/mysite/eggs/plone.dexterity-1.0-py2.7.egg/plone/dexterity/utils.py", line 149, in createContentInContainer
content = createContent(portal_type, **kw)
File "env/mysite/eggs/plone.dexterity-1.0-py2.7.egg/plone/dexterity/utils.py", line 105, in createContent
fti = getUtility(IDexterityFTI, name=portal_type)
File "env/mysite/eggs/zope.component-3.9.5-py2.7.egg/zope/component/_api.py", line 169, in getUtility
raise ComponentLookupError(interface, name)
zope.component.interfaces.ComponentLookupError: (<InterfaceClass plone.dexterity.interfaces.IDexterityFTI>, 'mysite.Widget')
正如我所提到的,我知道我的方法非常天真,我可能应该得到一记耳光。如果我以令人困惑的方式提出我的问题,我深表歉意。
我的问题是:
- 我可以
createContentInContainer
从 zopepy 实例化吗?我的操纵连接是否足够,或者脚本是否需要在应用程序中运行才能继承 Dexterity/FTI 完成我所要求的内容? - 我需要适配器吗?我从
grok.Adapter
and 继承并将接口传递给grok.provides
and的接口grok.context
,但它是否应该基于整个内容模式声明属性? - 元组列表是任意的。鉴于 ZODB 的结构,这似乎是要做的事情。如果我将内容类型的模式声明为已注册适配器中的属性,则应精心制作数据以符合对象(适配器)的属性,对吗?