2012-05-18 3 views
2

Я использую Plone 4.1.4, и я пытаюсь получить динамические источники для схемы.Чтобы работать, мне нужно заполнить список стран, который, в свою очередь, зависит от контекстного объекта.Поставщик динамических источников z3c.forms возвращает пустой словарь как объект контекста

Я использую этот пример: 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 .__ вызова __ () и я исследую объект контекста, последний оказывается просто пустым словарем.

Когда я пытаюсь использовать именованный пример утилиты в упомянутой выше статье, и подобное происходит, контекст также {}.

Может ли кто-нибудь указать мне, что я могу делать неправильно?

UPDATE

ZCML для формы оболочки, которая вызывает форму является

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

Где RegionClass наследует от формы оболочки, это может быть разрешение или проблема обхода?

ответ

2

Потому что ваш источник является классом, вам нужно создать его экземпляр:

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

В некоторых случаях, например, с использованием вложенных форм или сложной формы виджетов (виджет в виджет для списка выбора и т.д.), вам необходимо следовать указателям __parent__ в надлежащий внешний контекст для возврата в контекст Plone.

+0

Первоначально я думал, что это будет инициализировать и вызвать объект одновременно, но, похоже, это не так. Я просто попробовал это снова с тем же результатом - контекст по-прежнему является пустым словарем. Я подошел к стеку, чтобы определить ChoiceTerms (контекст, запрос, форму, поле, виджет) :, я получаю правильный объект запроса, но контекст пуст. Может быть проблема с ZCML slug (см. Мое обновление) –

+0

имеет ли форма указатель '__parent__'? –

+0

Да! Это объект, который должен быть контекстом. Как это произошло? –

 Смежные вопросы

  • Нет связанных вопросов^_^