django CMS Plugins und Apps – Hier sind die Unterschiede

30. Juli 2017

Ob man sich als Benutzer neu in django CMS einarbeitet, oder als Entwickler beginnt das erste Mal eine Webseite darauf aufzubauen, der Unterschied zwischen Plugins und Apps ist nicht immer sofort klar. Im Folgenden wollen wir den Unterschied sowohl für Anwender, als auch für Entwickler erklären.

django CMS Plugins - Layouting und große Freiheiten

Bei der Entwicklung von Templates in django CMS werden sogenannte Platzhalter in diesen eingesetzt. Die Platzhalter können dann später von den Nutzern des CMS mit Plugins befüllt werden.

Plugins erlauben dem Nutzer Seiteninhalte zu erstellen und zu strukturieren. Vom einfachen Darstellen eines Bildes, über Tabellen, Videos, Kacheln ist wirklich alles möglich. Viele Plugins gibt es bereits für django CMS, die Entwicklung von maßgeschneiderten Plugins ist sehr gut dokumentiert. Plugins werden immer innerhalb der Platzhalter eingesetzt. In der Strukturansicht kann man ihre Reihenfolge einfach per Drag’n’Drop manipulieren. In der Inhaltsansicht lassen sich ihre Inhalte einfach per Doppelklick bearbeiten.

django CMS - double click to edit GIF

 

Plugins sind verschachtelbar. Beispielsweise kann ein Textplugin auch Bilder enthalten.

Alle Plugins unterliegen dem Entwurf- und Veröffentlichen-Status einer Seite. Änderungen an Plugins werden also erst veröffentlicht, wenn der blaue Button „Änderungen Veröffentlichen“ oben rechts in der Toolbar betätigt wird.

django CMS Plugins - Was sind die Standards?

Welche Plugins sind bei django CMS vorinstalliert? Die Dokumentation von django CMS bietet eine Liste der django CMS Core Addons, welche mit der Installation des CMS bereits vorinstalliert sind. Diese umfasst die folgenden Plugins:

·  Django Filer – Management von Dateien und Bildern

·  django CMS Text CKEditor – der „standard“ WYSIWYG Editor für Benutzer von django CMS

·  django CMS Link – zum Verlinken von Inhalten

·  django CMS Picture – zum Hinzufügen von Bildern

·  django CMS File – zum Einbinden von Dateien

·  django CMS Style - für Nutzer, welche manuelle Anpassungen am Styling vornehmen wollen

·  django CMS Snippet – zum Einfügen von HTML Code

·  django CMS Audio – zum Einfügen von Audio Dateien

·  django CMS Video – zum Einfügen von Videos (intern und extern z.B. Youtube)

·  django CMS GoogleMap – Darstellung von Google Maps, basierend auf Adressen oder Koordinaten

 

Natürlich ist dies nicht das Ende der Fahnenstange. Es gibt zahlreiche weitere Plugins, welche von der Community entwickelt, betreut und konstant verbessert werden.

Weiterhin besteht natürlich immer die Möglichkeit Individual- oder Neuentwicklung für Plugins zu betreiben. Später in diesem Artikel ist ein Absatz zur Entwicklung von Plugins zu finden – und es ist gar nicht so schwer, wie man denken könnte. Indem Blueshoe Github Repository sind eine unserer eigenen Entwicklungen zu finden.

Komplexe Ansichten und Anwendungen in django CMS

django-CMS-Apps werden auf Seitenebene eingebunden. Sie können komplexe Zusammenhänge abbilden und erzeugen festgelegte Ansichten automatisch. Ihr Layout ist entsprechend oft statisch, jedoch ist die Verwendung von Plugins innerhalb von Apps nicht ausgeschlossen. Während sich die Funktionalität von Plugins auf ihre jeweilige Seite beschränken lässt, können Apps selbstständig Ansichten erzeugen. Ein typisches Beispiel für eine App ist ein Blog. Man aktiviert die App für eine Seite im CMS, z.B. /blog. Werden nun Artikel geschrieben, generiert die Blog-App selbstständig durchsuchbare Listen, Kategorie-Ansichten sowie die Detail-Ansichten der Blogeinträge. Ein weiteres Beispiel für eine App könnte ein Fragenbogen sein, welche vom Redakteur erstellt wird. Je nach Beantwortung der Fragen wird der Nutzer nach Abschluss auf eine speziell zugeschnittene Ergebnisseite weitergeleitet.

Standard-Apps in django CMS

Mit der Installation von django CMS werden keine Apps im Sinne eine django CMS App installiert. Das hat den einfachen Grund, dass Apps immer spezielle Anforderungen abbilden, welche nicht auf alle Benutzer abgebildet werden können (im Gegensatz zu z.B. Text und Bild Plugin). Nicht jeder braucht zwangsweise einen Blog, oder eine Verwaltung und Darstellung für Events. Dahingehend verfolgt django CMS das Prinzip den Kern der Software schlank zu halten und zusätzlich benötigte Komponenten nachträglich zu installieren. Dieses Github Repository bietet eine, leider nicht ganz aktuelle, aber umfangreiche Sammlung von guten django CMS Add-ons (Plugins und Apps).

Der Unterschied zwischen Apps und Plugins

Plugins dienen als Bausteine zur Gestaltung einer einzelnen Seite. Sie erlauben es dem Redakteur oder Editor auf den Seiten in django CMS Inhalte einzupflegen und auf verschiedene Art und Weise darzustellen. Alle Einstellungen, welche für ein Plugin getroffen werden, gelten nur für die einzelne Instanz und nicht übergreifend. Plugins werden i.d.R. mehrmals im CMS verwendet. Ihre Inhalte können direkt aus dem Input der Benutzer des Systems kommen, aber auch über Schnittstellen und vom CMS generierte Daten (z.B. Listen von Artikeln).

Apps definieren die gesamte Funktion einer Seite im CMS. Sie haben die Möglichkeit über eine Seite hinaus weitere Ansichten (Unterseiten) zu erzeugen. Auch Apps haben sind über Einstellungen individualisierbar und können selber über Platzhalter verfügen, in welche wiederum Plugins eingesetzt werden können.

Du bist kein Entwickler? Hier geht’s zum Fazit.

Wie entwickelt man ein django CMS Plugin?

Jedes django CMS Plugin besteht aus drei Basiskomponenten: eine Konfiguration, einem Publisher und einem Template. Die Konfiguration entspricht leitet sich von der Klasse cms.models.pluginmodel.CMSPlugin ab, wobei diese selbst von der bekannten Django Model Klasse ableitet. Sie enthält alle wichtigen Einstellungen, welche benötigt werden um die jeweilige Instanz darzustellen:

class ImageWithCaptionModel(CMSPlugin):
    image = models.Imagefield(...)
    caption = models.TextField(...)

In dieser konkreten Klasse werden also die Daten gehalten, welche eine Instanz der Plugins dann später zur Darstellung von einem Bild mit Unterschrift verwenden kann.

Der Publisher ist im Django-Jargon die „Admin-Oberfläche“ zum jeweiligen Model. Die Klasse CMSPluginBase, welcher zur Erstellung dieser Publisher verwendet wird, leitet selbst auch die ModelAdmin Klasse ab. Publisher kontrollieren, wie die Daten ins Template gelangen, welches Template zum rendern verwendet werden soll, ob Caching beim rendern verwendet werden sollte, welche Felder der Konfiguration der Redakteur bearbeiten kann und einiges mehr.

class ImageWithCaptionPlugin(CMSPluginBase):
    model = ImageWithCaptionModel

Dies ist eine simple Version eines Publishers, welche es erlaubt neue ImageWithCaption Instanzen im CMS zu erzeugen, diese zu bearbeiten und zu löschen.

Zu guter Letzt benötigt man ein Template, welches vorgibt wie das Plugin auf einer Seite dargestellt wird. Es enthält alle Variablen, welche vom Publisher in den Kontext gegeben werden. Standardmäßig ist das die Instanz des Models.

<img src=“{% thumbnail instance.image 200x200 %}“>
<div>{{ instance.caption }}</div>

Die Entwicklung von django CMS Plugins ist weitestgehend in der Dokumentation beschrieben.

Wie entwickelt man eine django CMS App?

Eine django CMS App ist im Grunde genommen eine normale Django App – mit ein paar Anpassungen. Wie bereits zuvor erwähnt werden Apps auf Seitenebene angelegt und zwar mit sogenannten Apphooks. Diese ermöglichen es dem CMS eine App, welche gegebenenfalls eine eigene Seitenstruktur mitbringt, einzubinden.

class ShowRoomApphook(CMSApp):
    name = _("Showroom")
    app_name = "showroom"

    def get_urls(self, page=None, language=None, **kwargs):
        return ["showroom.urls"]
        
apphook_pool.register(ShowRoomApphook)

 

In diesem Beispiel bauen wir eine Showroom-App – sie dient zur Darstellung der Kunstwerke eines Malers, welche die Webseite betreibt. Nachdem wir unsere URLs nun auch noch in die urls.py unseres Projektes eingetragen haben, ist prinzipiell der django CMS spezifische Teil um:

url(r'^showroom/', include('showroom.urls', namespace='showroom', app_name='showroom')),

Die urls.py für die App selbst muss auch angelegt werden:

urlpatterns = patterns('showroom.views',
    url(r'^$', CategoryListView.as_view(), name='category_list'),
    url(r'^artpiece/(?P<cat_id>\d+)/$',
        ArtPieceListView.as_view(), name='artpiece_list'),
)

Nun erstellen wir 2 Models, damit wir die Werke in der Datenbank repräsentieren können:

class Category(models.Model):
    name = models.Charfield(...)
    slug = models.Charfield(...)


class ArtPiece(models.Model):
    name = models.Charfield(...)
    image = models.ImageField(...)
    category = models.Foreignkey('Category', ...)

Weiterhin benötigen wir nun Views, zur Darstellung der Kunstwerke im Browser:

class CategoryListView(ListView):
    model = Category
    template = 'category_list.html'

class ArtPieceListView(ListView):
    model = ArtPiece
    template = 'art_piece_list.html'
    
    def get_queryset(self):
        qs = super(...)
        cat_id = kwargs.get('cat_id', None)
        if cat_id:
            qs = qs.filter(category__id=cat_id)
        return qs

Diese benutzen wiederum 2 Templates zur Darstellung der jeweiligen Listen. Der CategoryListView gibt eine Liste alle Kategorien der Kunstwerke aus, der ArtPieceListView gibt eine gefilterte Liste der Kunstwerke (gefiltert nach Kategorie). Diese beiden Views werden nun den URLs im Apphook hinzugefügt und schon können wir unsere neue App verwenden. Natürlich müssen wir die Models vorher Migrationen durchgeführt werden.

Eine detailierte Dokumentation zum Erstellen von Apps in django CMS ist hier zu finden: http://docs.django-cms.org/en/release-3.4.x/how_to/apphooks.html.

Unterschied und Gleichheit – django CMS Apps und Plugins

Nachdem wir nun herausgestellt haben, wie sich die Unterschiede zwischen Apps und Plugins sowohl für Benutzer als auch für Entwickler darstellen sollte hier auch nochmal gesagt werden: Bei entsprechender Implementierung, kann man dieselbe Darstellung von bestimmten Problemen sowohl mit Apps als auch mit Plugins erreichen. Es gibt auch Problemstellungen, bei denen es nun nicht offensichtlich ist, ob man eine App braucht, oder ein Plugin. Dazu sollte man sich immer genau den Verwendungszweck anschauen, für welchen die Komponente erstellt wird. Sollen viele Informationen automatisiert dargestellt werden, werden Unterseiten gebraucht, bzw. Logiken und Workflows, welche sicher immer wieder wiederholen? Dann ist wohl in der Regel eine App die richtige Lösung. Wird viel Flexibilität in der Darstellung gebraucht und lässt sich kein Muster in der Verwendung erkennen, so sollte man eher dazu tendieren ein Plugin als Problemlösung herzunehmen.

Die Implementierung der django CMS App ist auch auf Github zu finden: https://github.com/Blueshoe/django_cms_example

Weitere Vorteile zu Django-CMS und einige Beispielprojekte, die wir bereits umgesetzt haben kannst sind hier zu finden:
Django-CMS-Webseiten von Blueshoe

Zum Blueshoe-Newsletter anmelden: