2011-12-12 66 views
2

給出了基於z3c.form https://github.com/collective/Products.UserAndGroupSelectionWidget/blob/z3cform-widget/src/Products/UserAndGroupSelectionWidget/z3cform/widget.py如何從瀏覽器視圖訪問z3c.form窗口小部件設置

我想在一些BrowserView中訪問其設置和相應的字段以下部件。由於小部件不知道的模式和領域的前期,我感興趣的是做什麼的信息,我需要得到小部件和領域。目前,我有可用的字段名和背景,這似乎是足夠的拱形物https://github.com/collective/Products.UserAndGroupSelectionWidget/blob/z3cform-widget/src/Products/UserAndGroupSelectionWidget/browser.py#L60

編輯:爲了簡化問題,我想訪問場以某種Z3C形式並定義了小部件。除了傳遞請求和上下文以形成init,然後訪問該字段之外,我找不到其他方式。是否有多適配器?

的想法是有一個z3c.form小部件,勾人進入其中確實Ajax調用哪個領域。 ajax請求需要傳遞參數,響應將查找小部件的使用位置和設置。現在的問題是,如何來查找z3c.form場和信息需要這樣做呢?

+0

以下兩行代碼需要進行調整,以便代碼可以使用任何形式:https:// github .COM /集體/ Products.UserAndGroupSelectionWidget/BLOB/z3cform的小部件/ src目錄/產品/ UserAndGroupSelectionWidget/browser.py#L70 – iElectric

回答

5

獲取現場

如果你能得到的架構,就可以得到場。

對於靈巧的內容類型,如果您知道字段名稱和類型的portal_type,你可以從該類型的廠類型信息FTI)的模式。

所以,如果我們知道portal_typeFIELD_NAME

from zope.component import getUtility 
from plone.dexterity.interfaces import IDexterityFTI 
fti = getUtility(IDexterityFTI, name=portal_type) 
schema = fti.lookupSchema() 
field = schema.get(field_name) 

獲得了Widget

從z3c.form文檔:http://packages.python.org/z3c.form/widget.html

小部件是一個multiadapter ,所以如果你有外地,你可以得到它,像這樣:

ageWidget = zope.component.getMultiAdapter((field, request), 
    interfaces.IFieldWidget) 

重要:如果已指定但是通過plone.autoform一個小部件,那麼該控件將無法提取。 plone.autoform手動設置一個widgetFactoryz3c.form.field.Field對象上(這是不一樣的zope.schema場!)。拿到小部件那麼最好的辦法,就是你已經做了,通過手動調用啓動FieldWidget

因此,舉例來說,如果你想在UserAndGroupSelectionWidget

widget = FieldWidget(field, UserAndGroupSelectionWidget(field, request)) 

P.S因爲我也在集體使用選擇器小部件,我已經更新了代碼;)

+0

這是驚人的。謝謝!我以某種方式聞到靈巧需要參與,而這對於普通的z3c.form來說是不可能的。 – iElectric

+0

很高興我能幫忙:) –

相關問題