2

我正在使用 Plone 4.1.4 并且我正在尝试获取模式的动态源。选择工作,我需要填充国家列表,这又取决于上下文对象。

我正在使用这个例子: http: //plone.org/products/dexterity/documentation/manual/developer-manual/advanced/vocabularies

例如,对于 IContextSourceBinder,将返回一个空字典而不是实际的上下文对象:

from zope import interface
from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
from zope.schema.interfaces import IContextSourceBinder
import zope.schema
from z3c.form import form

class CountryGenerator(object):
    interface.implements(IContextSourceBinder)
    def __call__(self, context):
        #context is == {}
        import pdb; pdb.set_trace()
        return SimpleVocabulary([
            SimpleTerm(value="not_selected", title=_("Country Not Selected"))
                ])

class IStep(interface.Interface):
    region = schema.Choice(title=_("Select your country"),
                        required=True,
                        source=CountryGenerator,
                        default="not_selected")
class Step(form.Form):
    fields = field.Fields(IStep)
    label = _("Step")
    description = _("Select your country")

当在 CountryGenerator.__call__() 方法中命中调试点并检查上下文对象时,后者结果只是一个空字典。

当我尝试在上面提到的文章中使用命名实用程序示例时,会发生类似的事情,上下文也有 {}。

谁能指出我可能做错了什么?

更新

调用表单的表单包装器的 ZCML 是

<browser:page
  name="view"
  for="Products.oldproduct.MyFolderishClass"
  class=".file.RegionClass"
  permission="zope2.View"
  />

RegionClass 继承自 Form 包装器的地方,可能是权限问题还是遍历问题?

4

1 回答 1

2

因为你的源是一个类,你需要实例化它:

class IStep(interface.Interface):
    region = schema.Choice(title=_("Select your country"),
                        required=True,
                        source=CountryGenerator(),
                        default="not_selected")

在某些情况下,例如使用子表单或复杂表单小部件(用于列表选择的小部件内的小部件等),您需要按照__parent__指向适当外部上下文的指针返回 Plone 上下文。

于 2012-05-18T20:37:15.527 回答