2012-08-29 13 views
7

Vorrei elencare tutti i campi (ei valori) di un oggetto di destrezza.elenca i campi di un oggetto di destrezza

mi può facilmente accedere a un singolo valore di campo come questo myobject.myfield

Ma non so come elencare tutti i campi disponibili di un oggetto.

oggetti

risposta

8

destrezza sono definiti da uno schema, che è enumerabile:

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

Qui uso il .namesAndDescriptions() method, ma si può anche semplicemente usare l'interfaccia come un iteratore se non si dispone di alcun metodo sul tuo schema:

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

Ultimo ma non meno importante, zope.schema ha un metodo di utilità chiamato getFieldsInOrder che filtrerà il zope.schema campi in un'interfaccia; i metodi di questo elenco anche i metodi e gli attributi non-schema, getFieldsInOrder elenca solo zope.schema specifici tipi di attributi:

from zope.schema import getFieldsInOrder 

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

Se è stato definito lo schema attraverso-il-web, non si può sapere come cercare l'interfaccia per la vostra genere. È inoltre possibile recuperare l'interfaccia dello schema attraverso il tipo Informazione Fabbrica, o FTI in breve:

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

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

dove schema ora detiene l'interfaccia.

+2

Nota: Tutte le risposte qui solo danno i campi nell'interfaccia principale, non campi che possono essere aggiunti dai comportamenti. Sfortunatamente quelli sono considerati parte dei moduli di rendering e non esiste attualmente un buon modo per enumerarli tutti al di fuori del processo di rendering del modulo. –

0

È possibile in alternativa utilizzare il 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

Bello, ma ancora: funziona solo per i campi dello schema, non per il comportamento. –

3

Ho trovato un modo per farlo. Dato che lo schema di destrezza varia, non ho potuto utilizzare direttamente la proposta di Christophs. Ma questo ora funziona

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

come ha osservato David, non riuscivo a trovare un modo per enumerare i campi provenienti da comportamenti.

Così, scavando nella plone.dexterity, in funzione utils.getAdditionalSchemata ho trovato questo modo per risolvere il problema grosso modo:

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

Nota che questo * solo * ottiene comportamenti, quindi devi fare entrambe le cose. :-) –