plone - 在仅灵巧的环境中是否仍然需要 aq_inner(和 friend )?

标签 plone zope dexterity

我有一个浏览器 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 对象,则会发生以下情况:

  1. createContent将被调用创建 DX obj - 此时内容尚未 aq-wrapped。因此,如果您订阅 ObjectCreatedEvent,您将拥有一个非 aq 包装的对象。

  2. 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/

相关文章:

plone - 如何在 browser/configure.zcml 中使用 config.py 和 __init__.py(使用 paster)创建的权限以获得自定义权限?

templates - 如何制作插入其他较小内容项 View 的平面 View ?

plone - 查看plone目录结果的所有键

plone - 警告 : exceptions. key 错误 : u'Undefined namespace prefix: i18. '

plone - 限制灵巧文档的内容类型

python - 如何获取以自定义 Plone 灵巧表单显示的字段?

Plone 从 Ubuntu 8.04 升级到 Ubuntu 12.04

python - SqlAlchemy,生成的对象 Id 和 Zope 事务

plone - 如何在不重新启动 zeo 的情况下杀死 zeopack?

python - 由于错误卸载Python而在Mac上破坏了Python,如何让模块再次工作?