2013-02-26 22 views
6

Ich versuche, irgendeinen willkürlichen Code auszuführen, nachdem ein Dexterity-Inhaltstyp erstellt wurde. Zum Beispiel könnte der Inhaltstyp ein Pferd darstellen.Wie können Aktionen nach dem Erstellen von Inhaltstypen ausgeführt werden?

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

class IHorse(form.Schema): 

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

Ich mag die Logger Meldung „Erstellen Pferd“ in der Konsole gedruckt erhalten, wenn den App im Vordergrund läuft. Aber das Pferd ist erschaffen und ich bekomme keine Nachrichten dafür. Ich denke, dass Content-Objekte von der __init__ erstellt werden, aber vielleicht bin ich in einem Fehler.

Antwort

7

Sie haben die __init__ für das Schema Ihres Inhaltstyps angeschlossen. Das Schema wird als Grundlage für die Felder verwendet, die Ihren Inhalt füllen, aber es ist nicht die Inhaltstypklasse selbst.

Wenn Sie in Inhaltstyp Erstellung einzuhaken möchten, registrieren Sie event subscribers statt:

from zope.app.container.interfaces import IObjectAddedEvent 

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

Wenn Sie wirklich den Inhalt Artikel Initialisierung in einem __init__ Verfahren anpassen müssen, dann würden Sie erstellen, um Ihre eigene custom content class stattdessen.

from plone.dexterity.content import Item 

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