我的dexterity内容类型中有datagridfield,使用collective.z3cform。我有一个接口类,它将value_type定义为我的内容类型中主datagridfield的DictRow。
class IAssessment(interface):
assessment_item=schema.Choice(
title=u"Assessment Item",
values=[u"Item 1",u"Item 2"],
required=False
)
reference=schema.TextLine(title=u"Reference",required=False)
class Application(form.Schema,IImageScaleTraversable):
form.widget(app_assessment=DataGridFieldFactory)
app_assessment=schema.List(
title=u"Application Assessment",
value_type=DictRow(title=u"Application Assessment",schema=IAssessment)
)
是否可以使用来自其他内容类型的portal_catalog,根据目录查询为assessment_item字段下的IAssessment提供值。当我插入catalog = getToolByName(context,'portal_catalog')时我得到了一个错误,因为没有定义上下文,即使我在IAssessment中放置了一个参数上下文,我仍然得到了同样的错误。有没有办法可以在接口类中进行目录查询,如果没有其他方法吗?
答案 0 :(得分:1)
您最有可能想要一个上下文源绑定器,它是dynamic vocabulary的一种形式。
from zope.schema.interfaces import IContextSourceBinder
from zope.schema.vocabulary import SimpleVocabulary
from Products.CMFCore.utils import getToolByName
@grok.provider(IContextSourceBinder)
def assessmentItems(context):
catalog = getToolByName(context, 'portal_catalog')
return SimpleVocabulary.fromItems(
(result.getId(), result.getObject()) for result in catalog(...)
)
在字段定义中,然后将其作为vocabulary
传递:
assessment_item=schema.Choice(
title=u"Assessment Item",
vocabulary=assessmentItems,
required=False
)