我有一个浏览器 View ,在它的调用方法上有这样的东西:
def __call__(self):
context = aq_inner(self.context)
parent = aq_parent(context).
...
开头放个pdb玩玩,好像Dexterity没必要用是吧?
ipdb> self.context, id(self.context), self.context.__class__
(<Container at /plone/ausgaben>, 4651890160, <class 'plone.dexterity.content.Container'>)
ipdb> aq_inner(self.context), id(aq_inner(self.context)), aq_inner(self.context).__class__
(<Container at /plone/ausgaben>, 4651890160, <class 'plone.dexterity.content.Container'>)
所以无论是否使用aq_inner,结果都是一样的。
所以问题是:Dexterity(作为 self.context 并且在我们的项目中实际上一切都是基于 Dexterity 的)是否阻止我们必须用 aq_inner 和 aq_parent 等包装所有东西,而是直接使用对象或 __parent__
指针?
最佳答案
与 AT 内容类型一样,DX 内容类型也是 aq 包装的。所以你将面临与 AT 相同的行为(问题 :-))。
正如 sdupton 在他的 aq_parent(instance) == instance.__parent__
中所说的。父指针仍然通过获取来实现。
但与 AT 有细微差别。
如果您创建一个新的 DX 对象,则会发生以下情况:
createContent将被调用创建 DX obj - 此时内容尚未 aq-wrapped。因此,如果您订阅
ObjectCreatedEvent
,您将拥有一个非 aq 包装的对象。addContentToContainer将被调用,它将创建的 DX 内容添加到容器中。在
container._setObject
ObjectAddedEvent
将被触发。如果您订阅此事件,您将拥有 aq-wrapped dx 内容。
这在 AT 中是不同的,当然在这种情况下会触发其他事件,但 AT 内容始终是 aq-wrapped(也在工厂中,同时添加新的 AT obj)
如果我误解了什么,请告诉我。
关于plone - 在仅灵巧的环境中是否仍然需要 aq_inner(和 friend )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25622113/