器用さオブジェクトのすべてのフィールド(および値)をリストしたいと思います。
このような単一のフィールド値に簡単にアクセスできますmyobject.myfield
しかし、オブジェクトの使用可能なすべてのフィールドを一覧表示する方法がわかりません。
器用さオブジェクトは、列挙可能なスキーマによって定義されます。
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()
いますが、スキーマにメソッドがない場合は、インターフェイスをイテレータとして使用することもできます。
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)
Webを介してスキーマを定義した場合、タイプのインターフェースを検索する方法がわからない場合があります。ファクトリタイプ情報(略してFTI)を介してスキーマインターフェイスを取得することもできます。
from plone.dexterity.interfaces import IDexterityFTI
from zope.component import getUtility
schema = getUtility(IDexterityFTI, name='your.dexterity.type').lookupSchema()
ここschema
にインターフェースがあります。
デビッドが指摘したように、私は行動から来るフィールドを列挙する方法を見つけることができませんでした。
そこで、utils.getAdditionalSchemata関数でplone.dexterityを掘り下げて、問題を大まかに解決する方法を見つけました。
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):
# ...
私はそれをする方法を見つけました。器用さのスキームはさまざまなので、クリストフの提案を直接使用することはできませんでした。しかし、これは今は機能します
for key, value in getFieldsInOrder(obj.getTypeInfo().lookupSchema()):
value = getattr(getattr(obj, key), 'output', getattr(obj, key))
または、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
フィールドと動作からすべてのフィールドを一覧表示する方法を理解します。
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
あなたが使用することができiterSchemata
ますgetFieldsInOrder
:
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