1

我使用模式扩展为所有文件夹添加了一个属性。新属性称为 greetingText。每个文件夹都可以在整个链 A > B > C 中拥有 greetingText,但是我将 greetingText 设置为空字符串 ('')。如果 B 有一个 greetingText 并且当前上下文是针对对象 B 的,那么它应该显示 B greetingText。如果文件夹 B 或 C 的 greetingText 为空字符串,那么如果对象 B 是当前上下文,我希望 obj.getFields('greetingText') 改为提供容器文件夹 A 的 greetingText。我知道这是 Acquisition 的工作方式,但我认为只有当文件夹 B 的 greetingText 为 None 而不是实际值(即空字符串)时,它才会这样工作。这是来自连接到控制器页面模板的控制器 Python 脚本的上下文。

from Products.CMFPlone import PloneMessageFactory as _
from Products.CMFCore.utils import getToolByName

plone_utils = getToolByName(context, 'plone_utils')
plone_log=context.plone_log

req = context.REQUEST
res = req.RESPONSE

greeting = context.getField('greetingText').getAccessor(context)()

msg = "id= %s"%(greeting)

res.write(msg)

return
4

1 回答 1

3

对象的 aq_parent 属性允许您获取父对象。您可以爬上对象层次结构以查找问候语:

greeting = ''
while context is not None:
    accessor = getattr(context, 'getGreetingText')
    if accessor:
        greeting = accessor()
        if greeting:
            break
    context = context.aq_parent

这假设您没有更改该字段的 Archetypes 访问器的名称。

于 2013-08-21T19:44:29.870 回答