Skip to content

Einfacher Insert-hook in Django

Django powered

Für meine Zitatsammlung (einer DjangoAnwendung) war ich auf der Suche nach einer Möglichkeit, bei einem neu angelegten Zitat automatisch einen Eintrag auf dem Blog zu generieren. Somit ergaben sich

Zwei Fragestellungen

  • Wie bekommt man mit, wenn in Django ein Objekt neu angelegt wird?
  • Wie macht man per Python einen Eintrag in einem Wordpress-Blog?

Lösungen

Programmatisches Erstellen eines Eintrags in einem Wordpress-Blog per Python

Für diese Frage gibt es eine Lösung: wordpresslib (weitere Links im Wiki: WordpressPython).

Damit diese Bibliothek mit den von mir inzwischen hauptsächlich verwendeten Tags funktioniert, musste ich kleine Änderungen am Code der wordpresslib-Bibliothek machen (long lives GNU!).

Ein insert-hook in Django

Auch hier ist die Lösung denkbar einfach: Zum Schreiben eines Objekts in die Datenbank wird dessen save()-Methode aufgerufen. Das ist eine recht angenehme Eigenschaft von Djangos ObjektRelationalenMappers.

Also reicht es aus, die save()-Methode im eigenen Code zu überschreiben. Indem man überprüft, ob das zu speichernde Objekt bereits eine ID hat, kann man leicht feststellen, ob das Objekt ursprünglich aus der Datenbank gelesen wurde (also bereits vorhanden war) oder eine Neuanlage ist.

Diese ausbaufähige Idee habe ich von Django tips: auto-populated fields.

Im Code für meine Zitatsammlung sieht das jetzt so aus:

class Quote(models.Model):
    ...

    def save(self):
        is_new = False
        if not self.id:
            is_new = True
            
        super(Quote, self).save()

        if is_new:
            # quote = Quote.objects.get(id=self.id)
            quote = self
            post_to_wordpress(quote)

Inzwischen habe ich im Modell zu Quote ein zusätzliches Feld eingefügt, mit dem man in Djangos Adminansicht leicht festlegen kann, ob für ein neues Zitat ein Blog-Eintrag generiert werden soll. Also: zusätzliches Boolean-Feld ins Modell und das dann in der save()-Methode abfragen.

Fertig.

Verwandte Artikel

Post a Comment

Your email is never published nor shared. Required fields are marked *