Словарь не работает в схеме подобъекта коллектива.z3cform.datagridfield из-за контекста NO_VALUE

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

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

Глядя на заметку об отладке, я вижу, что контекст словаря - 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]

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


person quyetnd    schedule 12.07.2013    source источник
comment
Предоставьте свой zope.schema и трассировку ошибок/отладки, чтобы люди могли вам помочь.   -  person tisto    schedule 12.07.2013
comment
Я обновил с простой иллюстрацией и трассировкой   -  person quyetnd    schedule 12.07.2013


Ответы (1)


Это ограничение в 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

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