“我想让用户关闭我的产品”字段。文件将存储在其他地方。我好像做不到。在
下面是我的尝试。我无法让Products.Archetypes.Field.ObjectField.setStorage()
识别这个'noStorage'实例“提供”IStorage
。在
为了简洁起见,删除了许多无关紧要的代码,但是完整的源代码可以在https://github.com/flipmcf/rfa.kaltura找到
原型模式包括ATBlob.schema”以拉入“文件”字段,然后:
class KalturaVideo(ATBlob, KalturaBase.KalturaContentMixin):
nostorage = NoStorage()
directlyProvides(nostorage, INoStorage)
def __init__(self, oid, **kwargs):
if settings.storageMethod == u"No Local Storage":
import pdb; pdb.set_trace() #
#(Pdb) IStorage.providedBy(self.nostorage)
#True
self.getField('file').setStorage(self, self.nostorage)
我的存储类和接口非常无聊:
^{pr2}$configure.zcml
在'storage'包中还:
现在,在setStorage()
方法中:
def setStorage(self, instance, storage):
import pdb; pdb.set_trace()
#(Pdb) IStorage.providedBy(storage)
#False
#HeadDesk
if not IStorage.providedBy(storage):
raise ObjectFieldException, "Not a valid Storage method"
当我调试时,IStorage.providedBy(storage)
返回False
为什么它在调用代码的setStorage
和True
中返回False?我没有正确注册接口吗?在
请注意,在模块
Products.Archetypes.Field
中,IStorage
实例实际上来源于:比较接口解析顺序(通过
^{pr2}$__iro__
)我们得到由于}的父类,因此作为define的
INoStorage
是从ZODB.interfaces.IStorage
派生的子类,并且该接口类不是setStorage
调用providedBy
的{NoStorage
类将不满足该检查。要解决这个问题,只需让INoStorage
简单地继承IStorage
的原型版本并实现其所有方法,它就可以按预期工作了。在也就是说,您可以简单地将代码与提供接口的方式更进一步,请参见以下示例:
Interface
子类的继承将在没有额外的directlyProvides
定义的情况下正确地持续存在,因此您只需在KalturaVideo
类定义中删除额外的调用。当然,您可以只做from ... import IStorage
并简单地对class INoStorage(IStorage)
进行操作。这样做的例子是为了使事情更加明确可见。在相关问题 更多 >
编程相关推荐