【问题标题】:How to add the is_folderish attribute to Dexterity objects?如何将 is_folderish 属性添加到 Dexterity 对象?
【发布时间】:2013-03-02 17:25:07
【问题描述】:

.is_folderish 属性在很多地方都有使用。例如setting an object as the default viewactivating discussions on an object 时。

我的第一个问题是如何检查一个对象是否具有该属性集。我尝试使用类似这样的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

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

【问题讨论】:

  • 我修改了我之前的评论; is_folderish 是索引,isPrincipiaFolderish 是对象属性。这是在 Dexterity 对象上设置的,请参阅the source

标签: plone dexterity


【解决方案1】:

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

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

  • subscribers 可以监听IObjectCreatedEvent 事件:

    from zope.app.container.interfaces import IObjectAddedEvent
    
    @grok.subscribe(IYourDexterityType, IObjectCreatedEvent)
    def add_foo_attribute(obj, event):            
        obj.foo = 'baz'
    
  • custom content classes需要在你的类型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>
    

【讨论】:

    猜你喜欢
    • 2015-11-15
    • 2011-11-23
    • 2014-09-18
    • 2016-08-29
    • 2015-09-21
    • 2021-10-26
    • 1970-01-01
    • 2020-11-05
    • 2021-03-22
    相关资源
    最近更新 更多