2012-08-29 15 views
7

Chciałbym wyświetlić wszystkie pola (i wartości) obiektu zręczności.lista pól obiektu zręcznościowego

można łatwo uzyskać dostęp do takiej samej wartości pola jak ten myobject.myfield

Ale nie wiem, jak do listy wszystkich dostępnych pól obiektu.

Odpowiedz

8

Zręczność obiekty są definiowane przez schemat, który jest przeliczalny:

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

Tutaj używam .namesAndDescriptions() method, ale można też po prostu użyć interfejsu jako iterator, jeśli nie ma żadnych metod na swoje schemat:

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

Last but not least, zope.schema ma metodę narzędzie o nazwie getFieldsInOrder które będą filtrować zope.schema pól w interfejsie; powyższe metody wymieniają również metody i atrybuty bez schematu, getFieldsInOrder wymienia tylko zope.schema konkretne typy atrybutów:

from zope.schema import getFieldsInOrder 

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

Jeśli zdefiniowany schemat through-the-web, może nie wiedzieć, jak sprawdzić interfejs dla Twojego rodzaj. Można również pobrać interfejs schematu przez fabrykę Rodzaj informacji lub FTI w skrócie:

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

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

gdzie schema teraz posiada interfejs.

+2

Uwaga: Wszystkie odpowiedzi tutaj tylko dać pola na głównym interfejsie, nie pola, które mogą być dodawane przez zachowania. Niestety są one wymyślane w ramach renderowania formularzy, a obecnie nie ma dobrego sposobu na ich wyliczenie poza procesem renderowania formularzy. –

0

Można alternatywnie użyć 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

Fajnie, ale znowu: działa to tylko dla pól schematu, a nie zachowania –

3

znalazłem sposób, aby to zrobić. Ponieważ schemat zręczności jest różny, nie mogłem użyć sugestii Christophów bezpośrednio. Ale to działa teraz

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

jak zauważył David, nie mogłem znaleźć sposób, aby wyliczyć pól pochodzących z zachowań.

Tak, kopanie w plone.dexterity w funkcji utils.getAdditionalSchemata Znalazłem ten sposób, aby z grubsza rozwiązania problemu:

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

Pamiętaj, że to * tylko * spowoduje zachowanie, więc musisz zrobić jedno i drugie. :-) –

Powiązane problemy