z3c.formas dinâmicas de fontes de provedor retorna vazia dicionário como um objeto de contexto
Pergunta
Eu estou usando o Plone 4.1.4 e eu estou tentando chegar a dinâmica de fontes para um esquema.Escolha a trabalhar, eu preciso preencher a lista de país que, por sua vez, depende do contexto de objeto.
Eu estou usando este exemplo:http://plone.org/products/dexterity/documentation/manual/developer-manual/advanced/vocabularies
Para IContextSourceBinder, exemplo, um dicionário vazio em vez do atual contexto do objeto é retornado:
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")
Quando a depuração ponto é atingido dentro de CountryGenerator.__chamada__() método e eu examinar o objeto de contexto, estes últimos acabam por ser apenas um vazio dicionário.
Quando eu tento usar o nome do utilitário de exemplo no artigo mencionado acima, e a mesma coisa acontece, contexto, há também {}.
Alguém poderia me apontar para o que eu poderia estar fazendo de errado?
ATUALIZAÇÃO
ZCML para o formulário de wrapper que chama o formulário é
<browser:page
name="view"
for="Products.oldproduct.MyFolderishClass"
class=".file.RegionClass"
permission="zope2.View"
/>
Onde RegionClass herda de Forma wrapper, poderia ser de permissão ou transversal problema?
Solução
Devido a sua origem é de uma classe, você precisa criar uma instância:
class IStep(interface.Interface):
region = schema.Choice(title=_("Select your country"),
required=True,
source=CountryGenerator(),
default="not_selected")
Em determinadas circunstâncias, como com o uso de sub formas complexas ou formulário de widgets (widget dentro de um widget para a lista de seleções, etc), você precisa seguir o __parent__
ponteiros para o exterior contexto para voltar para o Plone contexto.