2013-02-26 13 views
6

私はDexterityコンテンツタイプが作成された後、任意のコードを実行しようとしています。例えば、コンテンツタイプは馬を表すことができる。コンテンツタイプの作成後にアクションを実行する方法は?

import logging 
logger = logging.getLogger("Plone") 

class IHorse(form.Schema): 

    def __init__(self, context): 
     logger.info('Creating horse') 
     super(self).init(self, context) 

私はフォアグラウンドでアプリケーションを実行するときに、コンソールに印刷された「馬の作成」ロガーメッセージを取得したいです。しかし、馬が作られ、私はそれのためのメッセージを取得しません。コンテンツタイプのオブジェクトは__init__で作成されていると思いますが、多分私は間違いです。

答えて

7

コンテンツタイプのスキーマ__init__にフックします。スキーマは、コンテンツを埋め込むフィールドの基礎として使用されますが、コンテンツタイプクラス自体ではありません。あなたは、コンテンツタイプの作成にフックしたい場合は

、あなたの代わりにevent subscribersを登録します。

from zope.app.container.interfaces import IObjectAddedEvent 

@grok.subscribe(IHorse, IObjectAddedEvent) 
def logHorseCreated(horse, event): 
    logger.info('Created a horse') 

あなたが本当に__init__方法でコンテンツ・アイテムの初期化をカスタマイズするを持っている場合は、あなたが作成する必要があるだろう、あなたの代わりにcustom content classを所有しています。

from plone.dexterity.content import Item 

class Horse(Item): 
    def __init__(self, id=None): 
     super(Horse, self).__init__(id) 
関連する問題