我创建了一个Dexterity内容类型并定义了一个简单的模式:
....
....
class IMyType(model.Schema):
myField = schema.TextLine(
title=_(u"My Field:"),
)
....
....
在Plone 4.3下,Dexterity内容类型提供IContentType。但是,在Plone 5.0.6下,似乎Dexterity内容类型不提供IContentType,因此queryContentType(IMyType)返回' None'。
此外:
IContentType.providedBy(IMyType)
返回'错误'。
尝试使用默认内容类型也会产生相同的否定结果。
显然,对于我的自定义内容类型,可以按如下方式解决:
....
from zope.interface import alsoProvides
....
class IMyType(model.Schema):
myField = schema.TextLine(
title=_(u"My Field:"),
)
alsoProvides(IMyType, IContentType)
queryContentType(IMyType)现在返回预期的架构,IContentType.providedBy(IMyType)返回' True'。
但是,我希望所有Dexterity内容类型自动提供IContentType。 我是否期望太多,或者这是plone.dexterity和/或Plone 5.x中的错误?
答案 0 :(得分:1)
plone.dexterity 2.0+在zope.app.content上只有一个“软依赖”,你的构建没有安装它。如果您将zope.app.content添加到setup.py install_requires
并在buildout中固定版本(3.5.1),则您的加载项可以在内容类型接口上提供所需的界面。如果这样做,所有内容类型架构/接口类都将提供IContentType。
答案 1 :(得分:0)
很抱歉我迟到的回复。我之所以需要这个,是因为我创建了一个CSV / PDF导出实用程序,用户可以根据需要导出对象。出于这个原因,我需要获取内容类型的模式以创建CSV文件的标题行并填充表。在我的Plone 4.3网站中,我通过以下方式做到了这一点:
#include<stdio.h>
int main(){
char ch='"';
printf("%c",ch);
return 0;
}
仅当对象提供IContentType并且因此需要zope.app.content时才有效。 请参阅https://docs.plone.org/external/plone.app.dexterity/docs/reference/manipulating-content-objects.html#object-introspection
更新文档可能会有所帮助,表明zope.app.content不再是开箱即用的。如果有更新的方法来获取不需要zope.app.content的对象架构,请告诉我!
干杯,
埃里克