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

时间:2015-01-28 22:41:30

标签: forms plone dexterity

我正在尝试控制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):
        ...
        ...
        ...

任何帮助将不胜感激:)

2 个答案:

答案 0 :(得分:3)

使用您的第一个选项,您只需要检查父obj是否提供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)

有关DefaultsInterfaces的更多信息。

答案 1 :(得分:-1)

使用@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