1

.is_folderish属性在许多地方使用。例如,将对象设置为默认视图激活对象讨论时

我的第一个问题是如何检查对象是否具有该属性集。我尝试使用bin/instance debug类似这样的东西:

>>> app.site.news.is_folderish
...
AttributeError: is_folderish

我想我无法以这种方式访问​​属性,因为app.site.news它是具有该属性的对象的包装器。

我的第二个问题是如何将该属性添加到新的 Dexterity 对象。我想我可以使用下面的代码来做到这一点(但在我的第一个问题得到解决之前我无法测试它)。

from zope import schema
from plone.dexterity.content import Item

class IHorse(form.Schema):
    ...

class Horse(Item):
    def __init__(self):
        super(Horse, self).__init__(id)
        is_folderish = False

但我不确定如何将这两个类联系起来。

4

1 回答 1

2

您不需要添加is_folderish到您的类型;它是目录中的一个索引,并且敏捷类型已经具有该索引的适当属性,isPrincipiaFolderish.

如果您确实需要为内容类型添加属性,您可以使用事件订阅者或创建自定义子类plone.dexterity.content.Item

  • 订阅者可以监听IObjectCreatedEvent事件:

    from zope.app.container.interfaces import IObjectAddedEvent
    
    @grok.subscribe(IYourDexterityType, IObjectCreatedEvent)
    def add_foo_attribute(obj, event):            
        obj.foo = 'baz'
    
  • 自定义内容类需要在您的 XML 类型中注册:

    from plone.dexterity.content import Item
    
    class MyItem(Item):
        """A custom content class"""
        ...
    

    然后在您的 Dexterity FTI XML 文件中,添加一个klass属性:

    <property name="klass">my.package.myitem.MyItem</property>
    
于 2013-03-02T17:47:57.067 回答