2012-08-29 23 views
7

El becerisi nesnesinin tüm alanlarını (ve değerlerini) listelemek isterim.El becerisi nesnesinin alanlarını listeler

Kolayca bu myobject.myfield

gibi tek alan değerini erişebilir Ama bir nesnenin Mevcut alanların listelemek için nasıl bilmiyorum.

cevap

8

Maharet nesneleri numaralandırılabilirse bir şema tarafından tanımlanmıştır: Burada

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() 

Ben .namesAndDescriptions() method kullanır, ancak üzerinde herhangi yöntemleri yoksa ayrıca sadece bir yineleyici olarak arayüzünü kullanabilirsiniz senin şema:

for name in IYourDexteritySchema: 
    value = getattr(yourDexterityInstance, name) 

Son olarak, zope.schema bir arayüzde zope.schema alanlarını filtreler getFieldsInOrder adında bir yardımcı program yöntemi vardır; Yukarıdaki yöntemler de getFieldsInOrder sadece zope.schema belirli özellik türlerini listeler, yöntem ve olmayan şema özelliklerini listelemek: Eğer aracılığıyla-web, sizin için arayüzünü nasıl aranacağını bilmiyor olabilir şema tanımlanmış ise

from zope.schema import getFieldsInOrder 

for name, field in getFieldsInOrder(IYourDexteritySchema): 
    value = getattr(yourDexterityInstance, name) 

senin yazın. Ayrıca kısa Fabrika Tipi Bilgiler veya FTI aracılığıyla şema arayüzü alabilirsiniz:

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

schema = getUtility(IDexterityFTI, name='your.dexterity.type').lookupSchema() 

schema şimdi arayüzü nerede tutar.

+2

Not: Tüm cevaplar burada sadece ana arayüzünde alanları değil vermek davranışlar tarafından eklenebilecek alanlar. Ne yazık ki bunlar form oluşturma formlarının bir parçası olarak tanımlanıyor ve şu anda bunları form işleme sürecinin dışında sıralamak için iyi bir yol yok. –

0

Alternatif bir yöntem olarak FTI kullanabilirsiniz:

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

Güzel, ama yine de: Bu sadece şema alanları için çalışıyor, davranış değil –

3

bunu yapmak için bir yol buldu. El becerisi düzeni değiştiğinden, doğrudan Christophs önerisini kullanamadım. Ama bu David belirtildiği gibi, ben davranışlar gelen alanları numaralandırmak için bir yol bulamadı şimdi

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

çalışır.

Yani, plone.dexterity içine kazma, utils.getAdditionalSchemata işlevinde Kabaca sorunu çözmek için bu yol buldu

:

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

Bunun yalnızca * davranışlar alacağını, her ikisini de yapmanız gerektiğini unutmayın. :-) –