2012-08-29 13 views
7

Tôi muốn liệt kê tất cả các trường (và các giá trị) của một đối tượng khéo léo.liệt kê các trường của đối tượng khéo léo

tôi có thể dễ dàng truy cập vào một giá trị trường duy nhất như thế này myobject.myfield

Nhưng tôi không biết làm thế nào để liệt kê tất cả các trường có sẵn của một đối tượng.

đối tượng

Trả lời

8

Dexterity được định nghĩa bởi một lược đồ, đó là đếm được:

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

Ở đây tôi sử dụng .namesAndDescriptions() method, nhưng bạn cũng có thể chỉ cần sử dụng giao diện như một iterator nếu bạn không có bất kỳ phương pháp trên của bạn schema:

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

cuối cùng nhưng không kém, zope.schema có một phương pháp hữu ích có tên getFieldsInOrder mà sẽ lọc trên zope.schema lĩnh vực trong một giao diện; các phương pháp trên cũng liệt kê các phương pháp và các thuộc tính phi lược đồ, getFieldsInOrder chỉ liệt kê zope.schema kiểu thuộc tính cụ thể:

from zope.schema import getFieldsInOrder 

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

Nếu bạn định nghĩa lược đồ thông qua-the-web, bạn có thể không biết làm thế nào để tìm kiếm giao diện cho bạn kiểu. Bạn cũng có thể truy xuất giao diện lược đồ thông qua Thông tin Loại Nhà máy hoặc FTI cho ngắn:

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

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

nơi schema hiện giữ giao diện của bạn.

+2

Lưu ý: Tất cả các câu trả lời ở đây chỉ cung cấp cho các lĩnh vực trên giao diện chính, không các trường có thể được thêm bởi các hành vi. Thật không may những người được tìm ra như là một phần của các hình thức dựng hình, và hiện tại không có cách nào tốt để liệt kê tất cả chúng bên ngoài quá trình tạo biểu mẫu. –

0

Hoặc bạn có thể sử dụng 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

Đẹp, nhưng một lần nữa: điều này chỉ hoạt động cho các trường lược đồ, không phải hành vi –

3

Tôi tìm thấy một cách để làm điều đó. Vì lược đồ khéo léo khác nhau nên tôi không thể trực tiếp sử dụng đề xuất Christophs. Nhưng công trình này hiện hoạt động

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

như David đã lưu ý, tôi không thể tìm cách liệt kê các trường đến từ hành vi.

Vì vậy, đào sâu vào plone.dexterity, trong chức năng utils.getAdditionalSchemata tôi thấy cách này để xấp xỉ giải quyết vấn đề:

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

Lưu ý rằng điều này sẽ * chỉ * có hành vi, vì vậy bạn cần phải làm cả hai. :-) –