私は器用性オブジェクトのすべてのフィールド(および値)をリストしたいと思います。は器用性オブジェクトのフィールドを一覧表示します
私は簡単にこのmyobject.myfield
のような単一のフィールドの値にアクセスすることができます。しかし、私は、オブジェクトのすべての利用可能なフィールドの一覧を表示する方法がわかりません。
私は器用性オブジェクトのすべてのフィールド(および値)をリストしたいと思います。は器用性オブジェクトのフィールドを一覧表示します
私は簡単にこの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()
methodを使用しますが、あなたは上の任意のメソッドを持っていない場合にもちょうどイテレータとしてのインターフェイスを使用することができますスキーマ:
for name in IYourDexteritySchema:
value = getattr(yourDexterityInstance, name)
なく、少なくとも最後に、zope.schema
はインタフェースでzope.schema
フィールドにフィルタを適用しますgetFieldsInOrder
という名前のユーティリティメソッドがあります。上記の方法はまた、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):
# ...
これは*動作*を取得するだけなので、両方を行う必要があることに注意してください。 :-) –
注:ここでの回答のすべてが唯一のメインインターフェイス上のフィールドを与え、ありませんビヘイビアによって追加されるフィールド。残念ながら、それらはレンダリングフォームの一部として考え出されており、現在、フォームレンダリングプロセスの外にすべてそれらを列挙する良い方法はありません。 –