django wagtail
Wir benutzen schon lange Django für Datenbank Projekte bei denen eher ein MVC Framework sinnvoll ist anstatt einem reinem CMS wie z.B. Typo3. Oft brauchen diese Projekte dann aber auch einen kleinen oder manchmal auch grösseren CMS Teil.
Als Kompanion CMS für solche Projekte haben wir schon einiges probiert:
- typo3, der aufwand für eine komplett anderes System ist natürlich recht gross, zwei logins sind nötig, doppelte Template Entwicklung
- django-cms, eins der grösseren django cms Systeme, etwas schwerfällig bei der Installation, nicht sehr flexibel, backend ist plain django mit ein paar addons
- feincms, erste Eindruck war gut, aber backend django admin editing ist nicht gerade „state of the art“
- plain django mit django-suit, django admin im neuem Anzug, asset Management etwas mühsam, basic CMS Funktionalität fehlt
Letztes Jahr haben wir mit wagtail eine Lösung gefunden die überzeugt.
- gutes backend editing
- sehr flexibel, mit Streamfields
- einfache Installation
- kann einfach zusätzlich in ein Django Projekt integriert werden
- admin interface kann AUCH für normale Django Modele genutzt werden
Gegenüber anderen CMS Systemen muss man die Content Typen selber in Django Python schreiben, d.h. installieren und sofort Content einfügen geht nicht. Der Vorteil ist das man durch das massgeschneiderte Content Model nur Felder hat die man braucht und diese auch vernünftige Namen haben. Das Editing wird dadurch einfacher und fast selbsterklärend.
Das wagtail admin interface kann auch für „normale“ django apps genutzt werden kann. Dadurch bekommt man ein System aus einem Guss für den Applikations und den CMS Teil, endlich!
So gibt es für den Benutzer keine Kontextswitch wenn er zwischen den verschiedenen Bereichen Applikation und CMS wechselt, so sollte es sein!
Wagtail ist von Haus aus natürlich für die CMS Aufgabe gewappnet und es fehlen ein paar Dinge die im normalen Django Admin zu Verfügung stehen.
Anbei ein paar Django apps für die Applikationsentwicklung mit wagtail
Foreign-Key Field
Dies must have basic ist bei wagtail nicht dabei. Mit wagtailmodelchooser kann man dies nachrüsten. Für M2M gibt es Lösungen in Wagtail aber nicht für ein FK Field.
Multiselectfield
Oft braucht man auch eine multiple Auswahl aus einen kleinem vordefinierten Subset, dann M2M einzusetzen erscheint mir etwas overkill, deswegen setzte ich auch gerne django-multiselectfield ein.
Beispiel
Hier die Benutzung von beiden Ergänzungapps.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
from django.db import models from django import forms from modelcluster.models import ClusterableModel from multiselectfield import MultiSelectField from wagtail.wagtailadmin.edit_handlers import FieldPanel from wagtail.wagtailsnippets.models import register_snippet from wagtailmodelchooser import register_model_chooser from wagtailmodelchooser.edit_handlers import ModelChooserPanel @register_snippet @register_model_chooser class Place(models.Model): title = models.CharField(max_length=255) postcode = models.PositiveIntegerField() city = models.CharField(max_length=100) @register_snippet class Item(ClusterableModel): title = models.CharField(max_length=255) DAYS = ( ('mon', 'Mon'), ('tue', 'Tue'), ('wed', 'Wed'), ('thu', 'Thu'), ('fri', 'Fri'), ) selected_days = MultiSelectField(default='', blank=True, max_length=25, choices=DAYS) desc_text = models.TextField() place = models.ForeignKey(Place) panels = [ ModelChooserPanel('place'), FieldPanel('title'), FieldPanel('selected_days', widget=forms.widgets.CheckboxSelectMultiple), FieldPanel('desc_text'), ] |
Admin Actions
Leider gibt es keine Admin Actions im wagtail admin. Für Aktionen auf ein Objekt kann man sich behelfen mit einem Button bei jedem Element, was nur suboptimal ist.
Man muss die modeladmin Templates überschreiben und eigene template tags machen. z.B. dieses modeladmin/course/course/includes/result_row_value.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{% load i18n modeladmin_tags itemadmin_tags %} {{ item }}{% if add_action_buttons %} {% if action_buttons %} <ul class="actions"> {% for button in action_buttons %} <li>{% include 'modeladmin/includes/button.html' %}</li> {% endfor %} <li> <a href="{% url 'item-excel-detail' obj.id %}" class="button button-small button-secondary" title="Excel">Excel</a> </li> </ul> {% endif %} {{ closing_tag }} {% endif %} |
wagtail 2.0
In der neuen 2.0 Version (aktuell 2.0rc1, sollte also nicht mehr so lange gehen) wird noch ein Manko ausgebügelt. Mit dem jetzigen Richttexteditor hallo.js
habe ich leider nicht nur gute Erfahrungen gemach. Ab 2.0 setzten sie auf Draft.js
, der sieht auf den ersten Blick schon etwas stabiler aus.