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.
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.
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.
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
Güzel, ama yine de: Bu sadece şema alanları için çalışıyor, davranış değil –
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))
ç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):
# ...
Bunun yalnızca * davranışlar alacağını, her ikisini de yapmanız gerektiğini unutmayın. :-) –
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. –