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.
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.
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.
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
Fajnie, ale znowu: działa to tylko dla pól schematu, a nie zachowania –
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))
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):
# ...
Pamiętaj, że to * tylko * spowoduje zachowanie, więc musisz zrobić jedno i drugie. :-) –
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. –