Seite 1 von 1
[django-cms] Model übersicht...
Verfasst: Mittwoch 4. Februar 2015, 09:57
von jens
Ich arbeite an einer Migration von PyLucid auf django-cms... Mir ist allerdings nicht so ganz klar, wie die django-cms Modelle funktionieren...
Gibt es irgendwo eine Übersicht über die Datenbank Modelle von django-cms?
Konkret hänge ich hier:
Code: Alles auswählen
from cms.api import create_page, add_plugin
page = create_page('My Page', 'my_template.html', 'en')
placeholder = page.placeholders.get(slot='body')
add_plugin(placeholder, 'TextPlugin', 'en', body='hello world')
(von
http://django-cms.readthedocs.org/en/la ... -workflows )
Das Problem ist
page.placeholders.get(slot='body') geht nicht. Einen Eintrag mit slot='body' gibt es nicht.
hab mal eine frische django-cms installation mit ckeditor gemacht und zwei Seiten angelegt. Dann den Datenbankinhalt angesehen.
Es gibt mehrere "cms_placeholder" Einträge:
Code: Alles auswählen
ID 1 - slot: clipboard
ID 2 - slot: content
ID 3 - slot: content
ID 4 - slot: content
ID 5 - slot: content
Re: [django-cms] Model übersicht...
Verfasst: Mittwoch 4. Februar 2015, 10:14
von jens
Ah, bin ein wenig weiter, mache jetzt quasi das:
Code: Alles auswählen
page = create_page('My Page', 'my_template.html', 'en')
placeholder = Placeholder(slot="content")
placeholder.save()
add_plugin(placeholder, 'TextPlugin', 'en', body='hello world')
s.:
https://github.com/jedie/PyLucid/commit ... 81a7583cf8
Mir ist der Sinn von Placeholder() nur nicht wirklich klar...
Re: [django-cms] Model übersicht...
Verfasst: Mittwoch 4. Februar 2015, 12:55
von jerch
@jens:
Placeholder sind in django-cms die Wurzelknoten für einen Pluginbaum (komponentenbasiert). Eine Seite ist zunächst nur ein leerer Platzhaltercontainer mit evtl. statischen Inhalten aus dem Template. Mit Plugins reicherst Du die Seiten mit Inhalten an, die Plugins selbst können verschachtelt sein (daher Pluginbaum). Die Idee erinnert ein wenig an CQ/Magnolia, wo die Inhalte (Komponenten) hierarchisch in einem Repo angelegt werden. Beim Rendern der Seite läuft django-cms quasi die Pluginhierarchie ab und rendert die einzelnen Plugins.
Deine "cms_placeholder" Einträge zeigen, dass Du irgendwo im Template einen Platzhalter 'content' hast, dass Clipboard kommt von django-cms und ermöglicht das Kopieren von Plugins zwischen Seiten und deren Platzhaltern.
Für eine Modelübersicht nutze ich django-extensions (IMHO ein Pflichtpaket, schon wegen der Debug- und shell_plus-Erweiterungen).
Re: [django-cms] Model übersicht...
Verfasst: Mittwoch 4. Februar 2015, 13:26
von jens
Danke für die Info. So ganz klar ist es mir aber dennoch nicht
Ich versuche mal
http://django-extensions.readthedocs.or ... odels.html ans laufen zu bekommen. Aber hab Python 3 und da klappt das installieren, von pygraphviz nicht direkt...
So aber schon:
Code: Alles auswählen
$ sudo apt-get install graphviz graphviz-dev
$ cd ~/PyLucid_env
(PyLucid_env) ~/PyLucid_env $ pip install pygraphviz --pre
$ cd ~/page_instance
~/page_instance $ ./manage.py graph_models -a > django-cms-model_graph.dot
~/page_instance $ dot django-cms-model_graph.dot -Tpng -o django-cms-model_graph.png
~/page_instance $ dot django-cms-model_graph.dot -Tsvg -o django-cms-model_graph.svg
Das kommt raus:
http://www.pylucid.org/static/pylucid.o ... _graph.dot
http://www.pylucid.org/static/pylucid.o ... _graph.png
http://www.pylucid.org/static/pylucid.o ... _graph.svg

Re: [django-cms] Model übersicht...
Verfasst: Mittwoch 4. Februar 2015, 13:55
von jerch
@jens:
django-cms ist eigentlich nur eine dünne Abstraktion über Django. Vllt. hilft es Dir, cms/views.py.details anzuschauen. Das ist der View für CMS-Seiten.
Re: [django-cms] Model übersicht...
Verfasst: Mittwoch 4. Februar 2015, 14:33
von jens
Mir ist der Aufbau immer noch nicht klar. Auch mit der Grafik
Mal das gegeben, eine Seite in zwei Sprachen:
* /de/ersteSeite
* /en/firstPage
Die Seite sieht so aus, von der Struktur:
- Text
- Bild
- Link
- Text
Dann haben wir in der DB:
* einen Page() Eintrag
* zwei Title() Einträge für "de", "en" mit ForeignKey zu Page
* 8x CMSPlugin() Einträge: 4x Text, Bild, Link, Text in "de" und 4x in "en" und jeder mit ForeignKey zu einem Placeholder
Also die Placeholder sind für die Verknüpfung der Struktur-Teile (CMSPlugin) zur Page da.
Nun könnte man nur einen haben:
Code: Alles auswählen
Page(id=1)
+
|
+--+Placeholder(id=1)
+
|
+---+CMSPlugin(plugin_type="Text")
|
+---+CMSPlugin(plugin_type="Bild")
|
+---+CMSPlugin(plugin_type="Link")
|
+---+CMSPlugin(plugin_type="Text")
Oder mehrere:
Code: Alles auswählen
Page(id=1)
+
|
+--+Placeholder(id=1) +---> CMSPlugin(plugin_type="Text")
|
+--+Placeholder(id=2) +---> CMSPlugin(plugin_type="Bild")
|
+--+Placeholder(id=3) +---> CMSPlugin(plugin_type="Link")
|
+--+Placeholder(id=4) +---> CMSPlugin(plugin_type="Text")
Eigentlich sind die Placeholder doch überflüssig... Und warum dockt CMSPlugin nicht an Title() an, dann wäre die Sprache auch direkt Verknüpft...
Also sowas:
Code: Alles auswählen
Page(id=1)
+
|
+--+Title(id=1, language="en")
| +
| |
| +---+CMSPlugin(plugin_type="Text")
| |
| +---+CMSPlugin(plugin_type="Bild")
| |
| +---+CMSPlugin(plugin_type="Link")
| |
| +---+CMSPlugin(plugin_type="Text")
|
|
+--+Title(id=2, language="de")
+
|
+---+CMSPlugin(plugin_type="Text")
|
+---+CMSPlugin(plugin_type="Bild")
|
+---+CMSPlugin(plugin_type="Link")
|
+---+CMSPlugin(plugin_type="Text")
Re: [django-cms] Model übersicht...
Verfasst: Mittwoch 4. Februar 2015, 15:05
von jerch
@jens:
Warum sollte man die Plugins unter Title einhängen? Schau Dir mal die Models dazu an, Title kümmert sich um nicht-HTML-Belange* wie Pfade, Metaangaben etc. während die Plugins Seiteninhalte abbilden. Das sind doch 2 verschiedene Aspekte, da ist es doch naheliegend diese auf Seitenebene zu assoziieren. Diese Trennung wird auch auf Adminebene durchgehalten - Title-Belange werden in einem abgespeckten Adminview links angezeigt, während Plugins über die Struktur/InPage-Ansicht verwaltet werden.
Edit:
*nicht-Darstellung-Belange der Seite (Titel und Metaangaben gehören natürlich auch zu HTML

)
Re: [django-cms] Model übersicht...
Verfasst: Donnerstag 5. Februar 2015, 14:08
von jens
Andere Frage: Gibt es eine fertige App um die Django-CMS models im Admin besser sehen/bearbeiten zu können???
Re: [django-cms] Model übersicht...
Verfasst: Donnerstag 5. Februar 2015, 17:15
von jens
Zum Model-Struktur ist mir gerade eingefallen: Einfach mal eine Seite Anlegen, mit inhalt füllen und dann versuchen die Page() zu löschen, dabei bekommt man eine Liste!
Hab eine Seite erstellt, in einer Sprache und einen Text und einen Link angefügt, dann bekommt man beim Löschen:
Code: Alles auswählen
Are you sure you want to delete the page "page_en"? All of the following related items will be deleted:
Page: page_en
Page-placeholder relationship: Page_placeholders object
Page: page_en
Page-placeholder relationship: Page_placeholders object
Title: page_en (page_en, en)
Title: page_en (page_en, en)
Danach eine "DE" Übersetzung angefangen, aber noch keinerlei Inhalte hinterlegt:
Code: Alles auswählen
Are you sure you want to delete the page "page_en"? All of the following related items will be deleted:
Page: page_en
Page-placeholder relationship: Page_placeholders object
Page: page_en
Page-placeholder relationship: Page_placeholders object
Title: page_en (page_en, en)
Title: page_en (page_en, en)
Title: page_de (page_de, de)
Danach nur einen Text Bereich hinzugefügt und "publish":
Code: Alles auswählen
Are you sure you want to delete the page "page_en"? All of the following related items will be deleted:
Page: page_en
Page-placeholder relationship: Page_placeholders object
Page: page_en
Page-placeholder relationship: Page_placeholders object
Title: page_en (page_en, en)
Title: page_en (page_en, en)
Title: page_de (page_de, de)
Title: page_de (page_de, de)
Danach noch ein Link und "publish" -> ändert nichts.
Noch ein Text und "publish" -> nichts.
Nach dieser Aktion habe ich:
10x CMSPlugins Einträge (5x Text und 5x Link)
6x Text einträge
Man hat wohl für "Draft" und "Publish" jeweils eine Kopie eines Plugin-Inhalts.
Lösche ich die Seite, sind alle CMSPlugin und Text Einträge weg. Wiederherstellen und "publish" und alles ist wieder da. Sehr schön, so soll es sein...
Demnach sieht man halt doch nicht alle Einträge beim löschen

Re: [django-cms] Model übersicht...
Verfasst: Freitag 6. Februar 2015, 13:08
von jens
Ich glaube ich steig langsam dahinter, was die Placeholder ermöglichen:
Man kann einen Placeholder auf verschiedenen Seite an verschiedenen Stellen Gleichzeitig packen.
An einer Stelle ändern und überall ist es geändert.
richtig?
Re: [django-cms] Model übersicht...
Verfasst: Freitag 6. Februar 2015, 14:23
von jens
Meine Migration läuft schon ganz gut:
https://github.com/jedie/PyLucid/blob/d ... ial.py#L32
Hab z.Z. aber ein Problem: Wird eine Seite in "en" und "de" erstellt, fehlt beim ersten der Draft Inhalt. Beim zweiten ist es da :K
Re: [django-cms] Model übersicht...
Verfasst: Freitag 6. Februar 2015, 16:05
von jerch
jens hat geschrieben:Ich glaube ich steig langsam dahinter, was die Placeholder ermöglichen:
Man kann einen Placeholder auf verschiedenen Seite an verschiedenen Stellen Gleichzeitig packen.
An einer Stelle ändern und überall ist es geändert.
richtig?
Ja das geht über Verlinkungen in den Seiten (vs. Kopieren, da werden die Inhalte geklont). Das ist aber nichts besonderes, das können Plugins für sich auch.
Formal sind die Placeholder doch nichts anderes als "Einfügepunkte" in den Templates (Slots im Model). Diese werden zu Exemplaren, um die verschiedenen Inhalte über verschiedene Seiten abzubilden. Da ist IMHO nichts weiter magisch dran. Ich verstehe sie eher als eine Art abgespeckte Pluginklasse, die die Rückbindung an Basis-Templates vornimmt.
Re: [django-cms] Model übersicht...
Verfasst: Freitag 6. Februar 2015, 16:57
von jens
jens hat geschrieben:Hab z.Z. aber ein Problem: Wird eine Seite in "en" und "de" erstellt, fehlt beim ersten der Draft Inhalt. Beim zweiten ist es da :K
Fehler gefunden:
https://github.com/jedie/PyLucid/commit ... 2f2b5c4418
Ich hab pro Sprache einen neuen Placeholder erzeugt, statt den vorhanden zu nutzten...
btw. ein wenig dumm finde ich das Page.languaes ein Komma-Separiertes DB Feld ist
