2012-09-06 31 views
3

我有一個Plone(4.2)形式是grokked。我想有一個特定領域的動態來源。該方案的相關部分:Plone敏捷的動態源RelationList

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 dexterity developer manual描述每一個變種。裝飾器結合RelationChoice(參見上文)的source屬性和命名詞彙類的方法都具有相同的結果。

回答

2

而不是呼救,我應該打電話給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) 

與來自我的問題的架構代碼相結合。