我正在为Dexterity做一个行为,我使用collective.z3cform.datagridfield。
这应该是:
+----+-------+----+
| title | value | link |
+----+-------+----+
tile = schema.TextLine
value = schema.TextLine
link = schema.Choice (Related Widget)
这是我的代码:
class IDifferentiation(form.Schema):
title = schema.TextLine(title=_(u'Title for this element', default=u'Title for this element'), required=True)
value = schema.TextLine(title=_(u'Text for this element', default=u'Text for this element'), required=False)
form.widget(downloads=RelatedItemsFieldWidget)
link = schema.Choice(
title=_(u"Person"),
source=UUIDSourceBinder(),
required=True)
class IDifferentiationBox(form.Schema):
""" """
form.widget(differentiation=DataGridFieldFactory)
differentiation = schema.List(
title=_(u"Differentiation"),
value_type=DictRow(title=_(u"Facts"), schema=IDifferentiation)
)
但是对于"链接" -Field,我只获得一个Select-Dropdown或一个In-Out-Widget(取决于使用的Widget),没有数据/ Contenttypes可供选择。
答案 0 :(得分:1)
我非常确定您使用的form directives
在您的IDifferentiation
界面上无效。由于它不是z3c.form,因此它是一个数据网格子表单。
但collective.z3cform.datagridfield添加了一些入口点来修改它的行为。
包example.conference
通过覆盖添加/编辑表单和视图模板,将不同的小部件添加到特定的datagrid子表单字段。
首先,您需要注册两个模板here
<browser:page
for="plone.dexterity.interfaces.IDexterityContent"
name="differentiationbox_edit"
class=".ifferentiationbox.DataGridEditView"
permission="cmf.ModifyPortalContent"
/>
<browser:page
for="plone.dexterity.interfaces.IDexterityContent"
name="ifferentiationbox_view"
class=".ifferentiationbox.DataGridView"
permission="zope2.View"
/>
其次,更改datagrid subform fields的小部件 仅在此答案中显示一个示例(编辑表单),因为它与添加表单和视图模板相同。
class DataGridEditView(DefaultEditForm):
"""Edit form that uses the ContentTreeWidget for some fields in
the datagrids.
"""
def datagridInitialise(self, subform, widget):
if widget.name == 'form.widgets.differentiation':
subform.fields['link'].widgetFactory = ContentTreeFieldWidget
因此,这会将ContentTreeFieldWidget
添加到您的datagrid子表单字段link
。
答案 1 :(得分:0)
问题不仅仅是这一行中的错误字段名称吗?:
form.widget(downloads=RelatedItemsFieldWidget)
应该是
form.widget(link=RelatedItemsFieldWidget)