4

私はGrokkedのPlone(4.2)フォームを持っています。特定のフィールドの動的ソースが必要です。スキーマの関連部分:

from plone.directives import form
from z3c.relationfield.schema import RelationList, RelationChoice
from five import grok
from plone.formwidget.contenttree import ObjPathSourceBinder


@grok.provider(ISourceContextBinder)
def availableAttachments(context)
    return ObjPathSourceBinder()


class IEmailFormSchema(form.Schema):

    attachments = RelationList(
        title = _(u'Attachments'),
        description = _(u'Select and upload attachments.'),
        default = [],
        value_type = RelationChoice(
                    title =_(u"attachment"),
                    default = [],
                    # source = ObjPathSourceBinder() # this works
                    source = availableAttachments),  # should do the same, but doesn't

        required = False
    )

これはにつながります:

ValueError: Invalid clone vocabulary

私は、 ploneの器用さの開発者マニュアルに記載されているすべてのバリアントを試しました。sourceデコレータを(上記を参照)の属性と組み合わせたメソッドRelationChoiceと、名前付きの語彙クラスはどちらも同じ結果になります。

4

1 に答える 1

3

助けを求める代わりに、私はObjPathSourceBinderオブジェクトを呼び出すべきでした。このコードは期待どおりに機能します。

@grok.provider(IContextSourceBinder)
def availableAttachments(context):

    path = '/'.join(context.getTmp_folder().getPhysicalPath())
    query = { "portal_type" : ("File","Image"),
              "path": {'query' :path } 
             }

    return ObjPathSourceBinder(navigation_tree_query = query).__call__(context) 

私の質問のスキーマコードと組み合わせて。

于 2012-09-06T10:50:24.803 に答える