如何通过object_provides获取RelationList进行过滤?

时间:2015-02-26 22:10:13

标签: plone dexterity z3c.form

我在使用RelationList显示我想要的小部件时遇到了一些麻烦。我见过的行为对我没有意义: / mysite / folder1 / foo - 新内容,我想创建一个关系 / mysite / folder2 / bar - 我要链接的项目。

source=ObjPathSourceBinder(object_provides='foo.bar.IMyInterface')

这似乎显示了所有Dexterity内容,无论界面如何 - 尽管只有提供IMyInterface的内容是可选择的。

source=ObjPathSourceBinder(navigation_tree_query={'object_provides':'foo.bar.IMyInterface'}))

我不明白为什么会导致不同的行为,但导致没有显示内容。它似乎是查询路径的问题,因为这确实有效:

source=ObjPathSourceBinder(navigation_tree_query={'path':{'query':'/mysite/folder2'},'object_provides':'foo.bar.IMyInterface'}))

然而,这并不理想,因为它需要了解路径。我期待这种行为只显示提供我的界面的文件夹内容和内容,只有提供我的界面的内容可供选择。这不可能吗?

我知道默认情况下不再支持关系 https://pypi.python.org/pypi/plone.app.dexterity#relation-support-no-longer-included-by-default(我正在使用plone.app.dexterity 1.2.1和Plone 4.2)

或者,一个简单的选择小部件就可以了,但我无法获得任何默认的z3c.form小部件来正常使用这个字段(它们渲染得很好,但是没有可选择的内容)。也许最好只使用带有词汇表的常规z3c架构列表,其中值是UID,并自己查找对象?

1 个答案:

答案 0 :(得分:0)

我之前不确定我做错了什么,但是我得到了以下工作以获得一个简单的选择框(已订购):     从五个进口grok     来自plone.directives导入表单     来自Products.CMFCore.utils import getToolByName     从z3c.form.browser.orderedselect导入OrderedSelectFieldWidget     来自z3c.relationfield.schema import RelationChoice,Relation,RelationList     从zope.schema.interfaces导入IContextSourceBinder     来自zope.schema.vocabulary import SimpleVocabulary,SimpleTerm

@grok.provider(IContextSourceBinder)
def possibleVals(context):
  catalog = getToolByName(context,'portal_catalog')
  brains = catalog(object_provides='foo.bar.IMyInterface')
  return SimpleVocabulary([SimpleTerm(value=b.getObject(),token=b.getPath(),title=b.Title) for b in brains])

...

form.widget(myfield=OrderedSelectFieldWidget)
myfield = RelationList(
    title=_(u'My field'),
    required=False,
    value_type=RelationChoice(title=_(u'My field'),
                              source=possibleVals),
    )