如何在基于父级的plone dexterity addform中设置bool类型的默认值

how to set the default value of bool type in plone dexterity addform based on parent

我正在尝试控制 schema.Bool 的默认值,但我希望它基于条件。我已经尝试了两种方法,但我无法弄清楚。

第一个选项:

def isCreatedInHomePage():

     print "is this pic being created at the site base? if it is, then default true.  if not default false"
     return False


class IPics(form.Schema):
    form.widget(displayOnHomepage=SingleCheckBoxFieldWidget)
    displayOnHomepage = schema.Bool(
            title=_(u"Display On Site Homepage"),
            #default=True,
            defaultFactory=isCreatedInHomePage,
            required=False,
        )

虽然 defaultFactory 确实被调用并将正确设置为 true 或 false(根据我告诉它的内容),但我不知道如何检查调用表单的父页面。关于我可以在那里使用什么的任何想法?

第二个选项我尝试在 AddForm 本身中控制它:

class AddForm(dexterity.AddForm):
    grok.name('pics')
    grok.context(IPics)

    def updateWidgets(self):
        print "in update widgets "

        super(AddForm, self).updateWidgets()
        # this will give an empty list if False (or not selected) and will
        # return "['selected']" if True (check box is checked)
        print 'self.widgets["displayOnHomepage"].value', self.widgets["displayOnHomepage"].value

        self.widgets["displayOnHomepage"].value = ['selected']

        # this will return to whatever is set in the above line.
        print 'self.widgets["displayOnHomepage"].value', self.widgets["displayOnHomepage"].value

    def createAndAdd(self, data):
        ...
        ...
        ...

任何帮助将不胜感激:)

使用你的第一个选项,你只需要检查父对象是否提供ISiteRoot接口。检查此示例,使用 form.default_value 装饰器代替 defaultFactory:

from Products.CMFCore.interfaces import ISiteRoot
from plone.directives import form
from zope import schema


class IPics(form.Schema):
    displayOnHomepage = schema.Bool(
        title=_(u"Display On Site Homepage"),
        required=False,
    )

@form.default_value(field=IPics['displayOnHomepage'])
def isCreatedInHomePage(data):
    return ISiteRoot.providedBy(data.context)

有关 Defaults and Interfaces 的更多信息。

根据@Mathias 的回答,我得到了其他想法并解决了这个问题。我觉得这是一种解决方法,并且存在更好的解决方案。我把它放到尽量避免可能的属性错误。

@form.default_value(field=IPics['displayOnHomepage'])
def isCreatedInHomePage(data):
    try:
        print data.context.getParentNode().portal_type
        if data.context.getParentNode().portal_type == 'Plone Site':
            return True
        else:
            return False
    except:
        pass