列出灵巧对象的字段

dom*_*ruf 8 plone dexterity

我想列出一个dexterity对象的所有字段(和值).

我可以轻松访问这样的单个字段值 myobject.myfield

但我不知道如何列出对象的所有可用字段.

Mar*_*ers 9

敏捷对象由一个可枚举的模式定义:

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()
Run Code Online (Sandbox Code Playgroud)

在这里,我使用该.namesAndDescriptions()方法,但如果您的架构上没有任何方法,您也可以将该接口用作迭代器:

for name in IYourDexteritySchema:
    value = getattr(yourDexterityInstance, name)
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的是,zope.schema有一个名为的实用程序方法getFieldsInOrder将过滤zope.schema接口中的字段; 上面的方法还列出了方法和非模式属性,getFieldsInOrder只列出了zope.schema特定的属性类型:

from zope.schema import getFieldsInOrder

for name, field in getFieldsInOrder(IYourDexteritySchema):
    value = getattr(yourDexterityInstance, name)
Run Code Online (Sandbox Code Playgroud)

如果您通过Web定义了架构,则可能不知道如何查找类型的界面.您还可以通过工厂类型信息或简称FTI检索架构界面:

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

schema = getUtility(IDexterityFTI, name='your.dexterity.type').lookupSchema()
Run Code Online (Sandbox Code Playgroud)

schema现在哪里有你的界面.

  • 注意:此处的所有答案仅提供主界面上的字段,而不是可能由行为添加的字段.不幸的是,这些都是渲染表单的一部分,目前还没有一种很好的方法可以在表单呈现过程之外枚举它们. (3认同)

小智 6

正如大卫所指出的那样,我无法找到一种方法来枚举来自行为的字段.

因此,深入了解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):
      # ...
Run Code Online (Sandbox Code Playgroud)


dom*_*ruf 5

我找到了一种方法来做到这一点。由于敏捷方案各不相同,我无法直接使用克里斯托夫的建议。但这现在有效

for key, value in getFieldsInOrder(obj.getTypeInfo().lookupSchema()):
    value = getattr(getattr(obj, key), 'output', getattr(obj, key))
Run Code Online (Sandbox Code Playgroud)