我正在尝试控制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):
...
...
...
任何帮助将不胜感激:)
答案 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)
有关Defaults和Interfaces的更多信息。
答案 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