2013-07-12 1 views
2

Я работаю над типом контента, который использует datagridfield. В подобъекте у меня есть поле выбора с пользовательским словарем.Словарь не работает над схемой субобъектов collect.z3cform.datagridfield из-за контекста NO_VALUE

Словарь работает за пределами datagrid (Если я использую его непосредственно в схеме типа содержимого). Но когда я добавляю его в подобъект, он больше не работает.

Глядя на отладочную записку, я вижу, что контекст возаменителя NO_VALUE.

Любая подсказка/направление, чтобы это сработало?

Это наиболее простая схема, которая не будет работать (я думаю):

# Import 
from zope import schema 
from zope.interface import Interface 

from plone.directives import form 
from collective.z3cform.datagridfield import DataGridFieldFactory, DictRow 

# The container 
class IMenu(Interface): 
    dishes = schema.List(value_type=schema.TextLine()) 

# The vocabulary 
@grok.provider(IContextSourceBinder) 
def getDishes(context): 
    terms = [SimpleVocabulary.createTerm(dish, dish, dish) for dish in context.dishes] 
    return SimpleVocabulary(terms) 

# The object line 
class IOrderLine(Interface): 
    dish = schema.Choice(source=getDishes) 
    quantity = schema.Int() 

# The object 
class IOrder(Interface): 
    form.widget(dishes=DataGridFieldFactory) 
    dishes = schema.List(value_type=DictRow(schema=IOrderLine)) 

Теперь зарегистрировать меню, заказ как тип контента сноровки, добавить меню и попытался добавить заказ в ней, я получена ошибка на странице «Просмотр заказа», и это трассировка:

Traceback (innermost last): 
    Module ZPublisher.Publish, line 126, in publish 
    Module ZPublisher.mapply, line 77, in mapply 
    Module Products.PDBDebugMode.runcall, line 70, in pdb_runcall 
    Module ZPublisher.Publish, line 46, in call_object 
    Module plone.z3cform.layout, line 66, in __call__ 
    Module plone.z3cform.layout, line 50, in update 
    Module plone.dexterity.browser.add, line 112, in update 
    Module plone.z3cform.fieldsets.extensible, line 59, in update 
    Module plone.z3cform.patch, line 30, in GroupForm_update 
    Module z3c.form.group, line 128, in update 
    Module z3c.form.form, line 134, in updateWidgets 
    Module z3c.form.field, line 277, in update 
    Module z3c.form.browser.multi, line 63, in update 
    Module z3c.form.browser.widget, line 171, in update 
    Module z3c.form.widget, line 477, in update 
    Module collective.z3cform.datagridfield.datagridfield, line 107, in updateWidgets 
    Module collective.z3cform.datagridfield.datagridfield, line 91, in getWidget 
    Module z3c.form.browser.widget, line 171, in update 
    Module z3c.form.object, line 217, in update 
    Module z3c.form.object, line 208, in updateWidgets 
    Module z3c.form.object, line 87, in update 
    Module plone.z3cform.patch, line 21, in BaseForm_update 
    Module z3c.form.form, line 150, in update 
    Module z3c.form.form, line 134, in updateWidgets 
    Module z3c.form.field, line 277, in update 
    Module z3c.form.browser.select, line 51, in update 
    Module z3c.form.browser.widget, line 171, in update 
    Module z3c.form.widget, line 220, in update 
    Module z3c.form.widget, line 214, in updateTerms 
    Module zope.component._api, line 107, in getMultiAdapter 
    Module zope.component._api, line 120, in queryMultiAdapter 
    Module zope.component.registry, line 238, in queryMultiAdapter 
    Module zope.interface.adapter, line 532, in queryMultiAdapter 
    Module z3c.form.term, line 96, in ChoiceTerms 
    Module zope.schema._field, line 349, in bind 
    Module waga.game.core.content.interfaces, line 202, in getDishes 
AttributeError: 'NO_VALUE' object has no attribute 'dishes' 
> /home/quyetnd/Projects/waga.game.core/src/waga/game/core/content/interfaces.py(202)getDishes() 
-> terms = [SimpleVocabulary.createTerm(dish, dish, dish) for dish in context.dishes] 

Объект контекста является экземпляром.

+0

Введите zope.schema и ошибка/трассировка, так что люди могут помочь вам. – tisto

+0

Я обновил простую иллюстрацию и трассировку – quyetnd

ответ

3

Это ограничение в z3c.form (по крайней мере, некоторые версии, я думаю, он был исправлен в новых).

Мой уродливые обходной путь в функции источника Vocab:

if not context: 
     context = getSite() 
     if not context: 
      # Form is rendered from console without HTTP request traversing, etc. 
      # and thread local site variable is not set 
      raise RuntimeError("Oh snap. Beer time.") 

... 

http://developer.plone.org/serving/traversing.html#using-getsite

+0

Спасибо за ответ Mikko :) – quyetnd

+0

Спасибо за ответ Mikko :) Я также сделал это, чтобы передать проблему в своем словаре. В plone.app.z3cform есть встроенная в Plone версия адаптера подформы, которая дает нам что-то более интересное, отличное от NO_VALUE, но по-прежнему недостаточно интеллектуальное в моем случае (а не в контексте plone). Обратите внимание, что из-за того, что plone.app.z3cform существует, адаптер DatagridFieldSubform никогда не будет поднят. Вместо этого Zope получил версию plone.app.z3cform, которая в настоящее время не поддерживает автоматическое распознавание. Мне нужно было перерегистрировать завод, чтобы он работал. – quyetnd