2012-08-29 55 views
7

我想列出敏捷對象的所有字段(和值)。列出敏捷對象的字段

我可以很容易地訪問這樣myobject.myfield

單個字段值,但我不知道如何列出一個對象的所有可用字段。

回答

8

敏捷對象由一個模式,這是枚舉的定義:

from zope.interface.interfaces import IMethod 

for name, desc in IYourDexteritySchema.namesAndDescriptions(): 
    value = getattr(yourDexterityInstance, name) 
    if IMethod.providedBy(desc): 
     # It's a method, call it 
     value = value() 

這裏我使用了.namesAndDescriptions() method,但你也可以只使用接口作爲迭代器,如果你沒有任何方法你模式:

for name in IYourDexteritySchema: 
    value = getattr(yourDexterityInstance, name) 

最後但並非最不重要的,zope.schema有一個名爲getFieldsInOrder工具方法,將在一個界面zope.schema字段進行過濾;上述方法還列出方法和非架構屬性,getFieldsInOrder只列出zope.schema特定的屬性類型:

from zope.schema import getFieldsInOrder 

for name, field in getFieldsInOrder(IYourDexteritySchema): 
    value = getattr(yourDexterityInstance, name) 

如果你定義的架構直通網絡,你可能不知道如何來查找界面爲你類型。您也可以通過檢索工廠類型信息,或FTI架構接口簡稱:

from plone.dexterity.interfaces import IDexterityFTI 
from zope.component import getUtility 

schema = getUtility(IDexterityFTI, name='your.dexterity.type').lookupSchema() 

其中schema現在擁有你的界面。

+2

注:所有的答案在這裏只給主界面上的字段,不可能由行爲添加的字段。不幸的是,這些都是渲染表單的一部分,現在還沒有一種很好的方法來枚舉表單渲染過程之外的所有方法。 –

0

您也可以使用FTI:

from plone.dexterity.interfaces import IDexterityFTI 
from zope.component import getUtility 

fti = getUtility(IDexterityFTI, name='rgd.venues.venue') 
schema = fti.lookupSchema() 
fields = getFieldsInOrder(schema) 
for key, value in fields: 
    # so something 
+0

不錯,但又一次:這隻適用於模式字段,而不是行爲 –

3

我找到了一種方法來做到這一點。由於靈巧方案的不同,我不能直接使用Christophs的建議。 但這個工程現在

​​
5

大衛指出,我無法找到一個方法來枚舉從行爲傳來的領域。

因此,深入挖掘plone.dexterity,在utils.getAdditionalSchemata功能,我發現這種方式大致解決這個問題:

from zope.schema import getFieldsInOrder 
from plone.behavior.interfaces import IBehaviorAssignable 

behavior_assignable = IBehaviorAssignable(context) 
if behavior_assignable: 
    behaviors = behavior_assignable.enumerateBehaviors() 
    for behavior in behaviors: 
    for k,v in getFieldsInOrder(behavior.interface): 
     # ... 
+1

請注意,這將*只*獲取行爲,因此您需要同時執行這兩個操作。 :-) –