如何在基于父级的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
我正在尝试控制 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