回答
敏捷對象由一個模式,這是枚舉的定義:
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
現在擁有你的界面。
您也可以使用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
不錯,但又一次:這隻適用於模式字段,而不是行爲 –
我找到了一種方法來做到這一點。由於靈巧方案的不同,我不能直接使用Christophs的建議。 但這個工程現在
大衛指出,我無法找到一個方法來枚舉從行爲傳來的領域。
因此,深入挖掘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. 在對敏捷對象發表評論時出錯
- 2. 隱藏描述字段與敏捷
- 3. 敏捷估計階段
- 4. 在mongodb對象中列出字段
- 5. 原型與敏捷對於新的內容類型和新的字段類型
- 6. 如何輸出WP7的HTML敏捷包
- 7. 上敏捷
- 8. HTML敏捷包
- 9. 基於敏捷
- 10. 敏捷架構
- 11. HTML敏捷包
- 12. 成爲敏捷
- 13. 基於自定義敏捷字段的過濾器集合
- 14. 使用不變的敏捷形式和字段集
- 15. Plone和敏捷:「relation」字段的默認值
- 16. Plone 4中使用敏捷的自定義字段大小
- 17. 類型的字段從數據庫敏捷工具包
- 18. 針對開發人員的敏捷類
- 19. 嘗試創建新的敏捷對象時ComponentLookupError
- 20. html敏捷包對象引用未設置爲對象的實例
- 21. 序列化字段對象
- 22. HTML敏捷包獲取所有輸入字段
- 23. 字段長度驗證 - 敏捷工具包
- 24. 敏捷工具包4.2 ...引用字段類型與模型
- 25. C#使用HTML敏捷包解析隱藏字段
- 26. 添加/編輯時複製/複製字段值(plone /敏捷)
- 27. 允許匿名用戶添加敏捷對象
- 28. 如何將is_folderish屬性添加到敏捷對象?
- 29. 使用敏捷包
- 30. HTML敏捷性包
注:所有的答案在這裏只給主界面上的字段,不可能由行爲添加的字段。不幸的是,這些都是渲染表單的一部分,現在還沒有一種很好的方法來枚舉表單渲染過程之外的所有方法。 –