在dexterity plone 4.2中使用自定义EditForm的getMultiadapter错误

时间:2013-06-06 19:16:16

标签: plone dexterity

我正在尝试打开一个自定义的editform,它只显示一个包含12个字段的表单中的一个字段:

class EditForm(dexterity.EditForm):
    grok.name('editCustom')
    grok.context(IInfo)

    def updateWidgets(self):
        super(EditForm, self).updateWidgets()
        self.widgets['alps'].mode = 'hidden'
        self.widgets['operationStatus'].mode = 'hidden'

# etc.

在我到达MultiField列表选项的字段之前,情况正常:

        self.widgets['siteContact'].mode = 'hidden'

(这是form.Schema中的条目):

siteContact = schema.List(
    title=_(u"Site Contact"),
    description =_(u"Select Site Contacts"),
    value_type=schema.Choice(vocabulary=("test.siteContact")),
    required=False,
)

但是当我尝试访问自定义EditForm时,我得到:

  Module z3c.form.widget, line 140, in render
  Module zope.component._api, line 109, in getMultiAdapter
ComponentLookupError: ((<Container at /test/first>, <HTTPRequest, URL=http://localhost:8080/test/first/@@editCustom>, <Products.Five.metaclass.EditForm object at 0x08F9D9F0>, <zope.schema._field.List object at 0x084844B0>, <OrderedSelectWidget 'form.widgets.siteContact'>), <InterfaceClass zope.pagetemplate.interfaces.IPageTemplate>, 'hidden')

2 个答案:

答案 0 :(得分:1)

我遇到了完全相同的问题但是现在不知道是否有修复或解决方法但是如果排序无关紧要,您可以尝试schema.Set(或schema.FrozenSet)而不是schema.List。这些都可以让您选择多个选项。我已经测试了Set个选项,它们都与mode hidden一起使用。

(1)Set / FrozenSet

field = zope.schema.Set(
   value_type=zope.schema.Choice(values=(1, 2, 3, 4)),
   default=set([1, 3]) )
widget = setupWidget(field)
widget.update()

widget.__class__
<class 'z3c.form.browser.select.SelectWidget'>

select widget:允许您从一组给定选项中选择一个或多个值

(2)列表

field = zope.schema.List(
value_type=zope.schema.Choice(values=(1, 2, 3, 4)),
    default=[1, 3] )
widget = setupWidget(field)
widget.update()

widget.__class__
<class 'z3c.form.browser.orderedselect.OrderedSelectWidget'>

ordered-select:允许您从一组给定选项中选择一个或多个值并对这些选项进行排序。

答案 1 :(得分:0)

看起来您可能错误地指定了词汇表。请更改

schema.Choice(vocabulary=("test.siteContact"))

schema.Choice(vocabulary="test.siteContact")