【问题标题】:list the fields of a dexterity object列出敏捷对象的字段
【发布时间】:2012-08-29 13:06:01
【问题描述】:

我想列出一个灵巧对象的所有字段(和值)。

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

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

【问题讨论】:

    标签: plone dexterity


    【解决方案1】:

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

    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 字段;以上方法还列出了方法和非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】:

    正如 David 所说,我无法找到一种方法来枚举来自行为的字段。

    所以,深入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):
          # ...
    

    【讨论】:

    • 请注意,这将获得行为,因此您需要同时执行这两项操作。 :-)
    【解决方案3】:

    我找到了一种方法。 由于灵巧方案各不相同,我无法直接使用 Christophs 的建议。 但这现在有效

    for key, value in getFieldsInOrder(obj.getTypeInfo().lookupSchema()):
        value = getattr(getattr(obj, key), 'output', getattr(obj, key))
    

    【讨论】:

      【解决方案4】:

      您也可以使用 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
      

      【讨论】:

      • 很好,但同样:这仅适用于架构字段,不适用于行为
      【解决方案5】:

      弄清楚如何从字段和行为中列出所有字段:

      from plone.behavior.interfaces import IBehavior
      from plone.dexterity.interfaces import IDexterityFTI
      from zope.component import getUtility
      
      
      def get_fields(portal_type):
          fti = getUtility(IDexterityFTI, name=portal_type)
          schema = fti.lookupSchema()
          fields = schema.names()
          for bname in fti.behaviors:
              factory = getUtility(IBehavior, bname)
              behavior = factory.interface
              fields += behavior.names()
          return fields
      

      【讨论】:

        【解决方案6】:

        您可以使用iterSchematagetFieldsInOrder

        from plone.dexterity.utils import iterSchemata
        from zope.schema import getFieldsInOrder
        
        for schema in iterSchemata(obj):
            print(u'  %s' % schema)
            for field in getFieldsInOrder(schema):
                print(u'    %s\t%s' % field)
        

        如果 obj 是 Document 它输出

        plone.dexterity.schema.generated.Plone_5_1643036771_2_583572_0_Document
        plone.app.dexterity.behaviors.discussion.IAllowDiscussion
          allow_discussion    plone.app.dexterity.behaviors.discussion.IAllowDiscussion.allow_discussion
        plone.app.dexterity.behaviors.exclfromnav.IExcludeFromNavigation
          exclude_from_nav    plone.app.dexterity.behaviors.exclfromnav.IExcludeFromNavigation.exclude_from_nav
        plone.app.dexterity.behaviors.id.IShortName
          id  plone.app.dexterity.behaviors.id.IShortName.id
        plone.app.dexterity.behaviors.metadata.IDublinCore
          title       plone.app.dexterity.behaviors.metadata.IBasic.title
          description plone.app.dexterity.behaviors.metadata.IBasic.description
          subjects    plone.app.dexterity.behaviors.metadata.ICategorization.subjects
          language    plone.app.dexterity.behaviors.metadata.ICategorization.language
          effective   plone.app.dexterity.behaviors.metadata.IPublication.effective
          expires     plone.app.dexterity.behaviors.metadata.IPublication.expires
          creators    plone.app.dexterity.behaviors.metadata.IOwnership.creators
          contributors        plone.app.dexterity.behaviors.metadata.IOwnership.contributors
          rights      plone.app.dexterity.behaviors.metadata.IOwnership.rights
        plone.app.contenttypes.behaviors.richtext.IRichTextBehavior
          text        plone.app.contenttypes.behaviors.richtext.IRichTextBehavior.text
        plone.app.relationfield.behavior.IRelatedItems
          relatedItems        plone.app.relationfield.behavior.IRelatedItems.relatedItems
        plone.app.versioningbehavior.behaviors.IVersionable
          changeNote  plone.app.versioningbehavior.behaviors.IVersionable.changeNote
          versioning_enabled  plone.app.versioningbehavior.behaviors.IVersionable.versioning_enabled
        plone.app.contenttypes.behaviors.tableofcontents.ITableOfContents
          table_of_contents   plone.app.contenttypes.behaviors.tableofcontents.ITableOfContents.table_of_contents
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 2012-11-11
          • 1970-01-01
          • 2013-06-13
          相关资源
          最近更新 更多