2012-08-29 33 views
7

Ich möchte alle Felder (und die Werte) eines Geschicklichkeitsobjekts auflisten.Liste die Felder eines Geschicklichkeitsobjekts

Ich kann leicht ein einzelnes Feld Wert wie diese myobject.myfield zugreifen

Aber ich weiß nicht, wie die alle verfügbaren Felder eines Objekts aufzulisten.

Antwort

8

Geschicklichkeit Aufgaben werden durch ein Schema definiert, die zählbare ist:

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

Hier verwende ich die .namesAndDescriptions() method, aber Sie können auch nur die Schnittstelle als Iterator verwenden, wenn Sie Ihre keine Methoden auf Schema:

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

Last but not least, zope.schema hat eine Dienstprogramm Methode getFieldsInOrder benannt, die auf zope.schema Felder in einer Schnittstelle filtern; die oben genannten Methoden auch eine Liste Methoden und nicht-Schema Attribute, getFieldsInOrder listet nur zope.schema spezifischen Attributtypen:

from zope.schema import getFieldsInOrder 

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

Wenn Sie das Schema durch-the-Web definiert sind, können Sie nicht wissen, wie die Schnittstelle suchen für Ihre Art. Sie können auch die Schema-Schnittstelle durch die Factory-Typinformation, oder FTI kurz abrufen:

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

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

wo schema jetzt Ihre Schnittstelle halten.

+2

Hinweis: Alle Antworten hier nur die Felder auf der Haupt-Schnittstelle geben, nicht Felder, die durch Verhalten hinzugefügt werden können. Leider werden diese als Teil von Rendering-Formularen erkannt und es gibt derzeit keine gute Möglichkeit, sie alle außerhalb des Formular-Rendering-Prozesses aufzulisten. –

0

Sie können alternativ die FTI verwenden:

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

Schön, aber wieder: das funktioniert nur für Schema-Felder, nicht Verhalten –

3

fand ich einen Weg, es zu tun. Da das Geschicklichkeitsschema variiert, konnte ich Christophs Vorschlag nicht direkt verwenden. Aber das funktioniert jetzt

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

als David erwähnt, ich keinen Weg, um die Felder von Verhaltensweisen kommen aufzuzählen finden konnte.

Also, in plone.dexterity Graben, in utils.getAdditionalSchemata Funktion ich diesen Weg gefunden, um etwa das Problem zu lösen:

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

Beachten Sie, dass dies * nur * Verhaltensweisen erhalten, so dass Sie beide tun müssen. :-) –