2012-08-29 9 views
7

私は器用性オブジェクトのすべてのフィールド(および値)をリストしたいと思います。は器用性オブジェクトのフィールドを一覧表示します

私は簡単にこのmyobject.myfield

のような単一のフィールドの値にアクセスすることができます。しかし、私は、オブジェクトのすべての利用可能なフィールドの一覧を表示する方法がわかりません。

答えて

8

敏捷オブジェクトが列挙されたスキーマで定義されています。

ここ
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が今、あなたのインタフェースを保持しています。

+2

注:ここでの回答のすべてが唯一のメインインターフェイス上のフィールドを与え、ありませんビヘイビアによって追加されるフィールド。残念ながら、それらはレンダリングフォームの一部として考え出されており、現在、フォームレンダリングプロセスの外にすべてそれらを列挙する良い方法はありません。 –

0

あなたは、代わりに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 
+0

いいえ、もう一度:これはスキーマフィールドでのみ動作し、動作ではありません –

3

私はそれを行うための方法を発見しました。 巧妙なスキームが変わったので、私はChristophsの提案を直接使用することはできませんでした。 しかし、これはダビデが述べたように、私は行動から来るのフィールドを列挙するための方法を見つけることができませんでした今

​​
5

動作します。

そうで、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

これは*動作*を取得するだけなので、両方を行う必要があることに注意してください。 :-) –

関連する問題