{"id":1259,"date":"2018-02-19T13:39:59","date_gmt":"2018-02-19T13:39:59","guid":{"rendered":"https:\/\/www.taywa.ch\/blog\/?p=1259"},"modified":"2018-03-06T11:25:32","modified_gmt":"2018-03-06T11:25:32","slug":"django-wagtail","status":"publish","type":"post","link":"https:\/\/www.taywa.ch\/blog\/django\/django-wagtail\/","title":{"rendered":"django wagtail"},"content":{"rendered":"<p>Wir benutzen schon lange Django f\u00fcr 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\u00f6sseren CMS Teil.<\/p>\n<p>Als Kompanion CMS f\u00fcr solche Projekte haben wir schon einiges probiert:<\/p>\n<ul>\n<li>typo3, der aufwand f\u00fcr eine komplett anderes System ist nat\u00fcrlich recht gross, zwei logins sind n\u00f6tig, doppelte Template Entwicklung<\/li>\n<li>django-cms, eins der gr\u00f6sseren django cms Systeme, etwas schwerf\u00e4llig bei der Installation, nicht sehr flexibel, backend ist plain django mit ein paar addons<\/li>\n<li>feincms, erste Eindruck war gut, aber backend django admin editing ist nicht gerade &#8222;state of the art&#8220;<\/li>\n<li>plain django mit <a href=\"http:\/\/djangosuit.com\">django-suit<\/a>, django admin im neuem Anzug, asset Management etwas m\u00fchsam, basic CMS Funktionalit\u00e4t fehlt<\/li>\n<\/ul>\n<p>Letztes Jahr haben wir mit \u00a0<a href=\"https:\/\/wagtail.io\">wagtail<\/a>\u00a0eine L\u00f6sung gefunden die \u00fcberzeugt.<\/p>\n<ul>\n<li>gutes backend editing<\/li>\n<li>sehr flexibel, mit Streamfields<\/li>\n<li>einfache Installation<\/li>\n<li>kann einfach zus\u00e4tzlich in ein Django Projekt integriert werden<\/li>\n<li>admin interface kann AUCH f\u00fcr normale Django Modele genutzt werden<\/li>\n<\/ul>\n<p>Gegen\u00fcber anderen CMS Systemen muss man die Content Typen selber in Django Python schreiben, d.h. installieren und sofort Content einf\u00fcgen geht nicht. Der Vorteil ist das man durch das massgeschneiderte Content Model nur Felder hat die man braucht und diese auch vern\u00fcnftige Namen haben. Das Editing wird dadurch einfacher und fast selbsterkl\u00e4rend.<\/p>\n<p>Das wagtail admin interface kann auch f\u00fcr &#8222;normale&#8220; django apps genutzt werden kann. Dadurch bekommt man ein System aus einem Guss f\u00fcr den Applikations und den CMS Teil, endlich!<\/p>\n<p>So gibt es f\u00fcr den Benutzer keine Kontextswitch wenn er zwischen den verschiedenen Bereichen Applikation und CMS wechselt, so sollte es sein!<\/p>\n<p>Wagtail ist von Haus aus nat\u00fcrlich f\u00fcr die CMS Aufgabe gewappnet und es fehlen ein paar Dinge die im normalen Django Admin zu Verf\u00fcgung stehen.<\/p>\n<p>Anbei ein paar Django apps f\u00fcr die Applikationsentwicklung mit wagtail<\/p>\n<h3>Foreign-Key Field<\/h3>\n<p>Dies must have basic ist bei wagtail nicht dabei. Mit <a href=\"https:\/\/github.com\/takeflight\/wagtailmodelchooser\/\">wagtailmodelchooser<\/a> kann man dies nachr\u00fcsten. F\u00fcr M2M gibt es L\u00f6sungen in Wagtail aber nicht f\u00fcr ein FK Field.<\/p>\n<h3>Multiselectfield<\/h3>\n<p>Oft braucht man auch eine multiple Auswahl aus einen kleinem vordefinierten Subset, dann M2M einzusetzen erscheint mir etwas overkill, deswegen setzte ich auch gerne\u00a0<a href=\"https:\/\/github.com\/goinnn\/django-multiselectfield\">django-multiselectfield<\/a> ein.<\/p>\n<h3>Beispiel<\/h3>\n<p>Hier die Benutzung von beiden Erg\u00e4nzungapps.<\/p>\n<pre class=\"lang:python decode:true \">from django.db import models\r\nfrom django import forms\r\nfrom modelcluster.models import ClusterableModel\r\nfrom multiselectfield import MultiSelectField\r\nfrom wagtail.wagtailadmin.edit_handlers import FieldPanel\r\nfrom wagtail.wagtailsnippets.models import register_snippet\r\nfrom wagtailmodelchooser import register_model_chooser\r\nfrom wagtailmodelchooser.edit_handlers import ModelChooserPanel\r\n\r\n\r\n@register_snippet\r\n@register_model_chooser\r\nclass Place(models.Model):\r\n    title = models.CharField(max_length=255)\r\n    postcode = models.PositiveIntegerField()\r\n    city = models.CharField(max_length=100)\r\n\r\n\r\n@register_snippet\r\nclass Item(ClusterableModel):\r\n    title = models.CharField(max_length=255)\r\n    DAYS = (\r\n        ('mon', 'Mon'),\r\n        ('tue', 'Tue'),\r\n        ('wed', 'Wed'),\r\n        ('thu', 'Thu'),\r\n        ('fri', 'Fri'),\r\n    )\r\n\r\n    selected_days = MultiSelectField(default='', blank=True, max_length=25, choices=DAYS)\r\n    desc_text = models.TextField()\r\n    place = models.ForeignKey(Place)\r\n\r\n    panels = [\r\n        ModelChooserPanel('place'),\r\n        FieldPanel('title'),\r\n        FieldPanel('selected_days', widget=forms.widgets.CheckboxSelectMultiple),\r\n        FieldPanel('desc_text'),\r\n    ]<\/pre>\n<h3>Admin Actions<\/h3>\n<p>Leider gibt es keine Admin Actions im wagtail admin. F\u00fcr Aktionen auf ein Objekt kann man sich behelfen mit einem Button bei jedem Element, was nur suboptimal ist.<\/p>\n<p>Man muss die\u00a0modeladmin Templates \u00fcberschreiben und eigene template tags machen. z.B. dieses `modeladmin\/course\/course\/includes\/result_row_value.html`<\/p>\n<pre class=\"lang:xhtml decode:true\">{% load i18n modeladmin_tags itemadmin_tags %}\r\n{{ item }}{% if add_action_buttons %}\r\n    {% if action_buttons %}\r\n    &lt;ul class=\"actions\"&gt;\r\n        {% for button in action_buttons %}\r\n            &lt;li&gt;{% include 'modeladmin\/includes\/button.html' %}&lt;\/li&gt;\r\n        {% endfor %}\r\n            &lt;li&gt;\r\n                &lt;a href=\"{% url 'item-excel-detail' obj.id %}\" class=\"button button-small button-secondary\" title=\"Excel\"&gt;Excel&lt;\/a&gt;\r\n            &lt;\/li&gt;\r\n    &lt;\/ul&gt;\r\n    {% endif %}\r\n    {{ closing_tag }}\r\n{% endif %}\r\n<\/pre>\n<h3>wagtail 2.0<\/h3>\n<p>In der neuen 2.0 Version (aktuell 2.0rc1, sollte also nicht mehr so lange gehen) wird noch ein Manko ausgeb\u00fcgelt. Mit dem jetzigen Richttexteditor <code>hallo.js<\/code> habe ich leider nicht nur gute Erfahrungen gemach. Ab 2.0 setzten sie auf <code>Draft.js<\/code>, der sieht auf den ersten Blick schon etwas stabiler aus.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wir benutzen schon lange Django f\u00fcr 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\u00f6sseren CMS Teil. Als Kompanion CMS f\u00fcr solche Projekte haben wir schon einiges probiert: typo3, der aufwand f\u00fcr eine komplett<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,204,201],"tags":[203,202],"class_list":["post-1259","post","type-post","status-publish","format-standard","hentry","category-django","category-python","category-wagtail","tag-mvc","tag-python"],"_links":{"self":[{"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/posts\/1259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/comments?post=1259"}],"version-history":[{"count":11,"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/posts\/1259\/revisions"}],"predecessor-version":[{"id":1371,"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/posts\/1259\/revisions\/1371"}],"wp:attachment":[{"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/media?parent=1259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/categories?post=1259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/tags?post=1259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}