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)

アプリをフォアグラウンドで実行しているときに、ロガー メッセージ「Creating horse」をコンソールに出力したいと考えています。しかし、馬が作成され、メッセージが表示されません。コンテンツ タイプ オブジェクトは によって作成されていると思いますが__init__、間違っている可能性があります。

4

1 に答える 1

7

コンテンツ タイプ__init__スキーマにフックしました。スキーマは、コンテンツを入力するフィールドの基礎として使用されますが、コンテンツ タイプ クラス自体ではありません。

コンテンツ タイプの作成にフックする場合は、代わりにイベント サブスクライバーを登録します。

from zope.app.container.interfaces import IObjectAddedEvent

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

メソッドでコンテンツ アイテムの初期化を本当にカスタマイズする必要がある場合は、代わりに独自のカスタム コンテンツ クラス__init__を作成する必要があります。

from plone.dexterity.content import Item

class Horse(Item):
    def __init__(self, id=None):
        super(Horse, self).__init__(id)
于 2013-02-26T20:58:33.487 に答える