1

Collective.z3cform を使用して、Dexterity コンテンツ タイプに datagridfield があります。コンテンツ タイプのメイン データグリッド フィールドの value_type を DictRow として定義するインターフェイス クラスがあります。

class IAssessment(interface):
    assessment_item=schema.Choice(
        title=u"Assessment Item",
        values=[u"Item 1",u"Item 2"],
        required=False
    )
    reference=schema.TextLine(title=u"Reference",required=False)


class Application(form.Schema,IImageScaleTraversable):
    form.widget(app_assessment=DataGridFieldFactory)
    app_assessment=schema.List(
        title=u"Application Assessment",
        value_type=DictRow(title=u"Application Assessment",schema=IAssessment)
    )

他のコンテンツ タイプの portal_catalog を使用したカタログ クエリに基づいて、assessment_item フィールドの下に IAssessment の値を指定することは可能ですか。コンテキストが定義されていないため、catalog=getToolByName(context, 'portal_catalog') を挿入するとエラーが発生しました。IAssessment にパラメーター コンテキストを配置しても、同じエラーが発生します。インターフェイス クラスでカタログ クエリを実行する方法はありますか?

4

1 に答える 1

1

ほとんどの場合、動的語彙の形式であるコンテキスト ソース バインダーが必要です。

from zope.schema.interfaces import IContextSourceBinder
from zope.schema.vocabulary import SimpleVocabulary
from Products.CMFCore.utils import getToolByName

@grok.provider(IContextSourceBinder)
def assessmentItems(context):
    catalog = getToolByName(context, 'portal_catalog')
    return SimpleVocabulary.fromItems(
        (result.getId(), result.getObject()) for result in catalog(...)
    )

フィールド定義では、これを次のように渡しますvocabulary

assessment_item=schema.Choice(
    title=u"Assessment Item",
    vocabulary=assessmentItems,
    required=False
)
于 2012-09-13T05:32:07.757 に答える