Hallo,
ich habe ein fertiges Django-Projekt mit mehreren views und templates. In einer base.html sind die statischen Inhalte, die auf jeder url erscheinen sollen (header, footer), hinterlegt.
Jetzt ist die Notwendigkeit entstanden, die base.html zu erweitern. Im Header sollen jetzt Daten dargestellt werden, welche in der Datenbank gespeichert sind.
Grundsätzlich ist das kein Problem, ich suche jedoch nach einer effizienten Methode für die Umsetzung. Muss ich jetzt jede einzelne view in meinem Projekt um die Datenbankabfrage erweitern, damit die Daten für die neuen template tags der base.html bereitsgestellt werden? Oder gibt es eine Möglichkeit, dass vor dem rendern der base.html eine Funktion aufgerufen wird, welche die Datenbankabfrage durchführt?
Ich hoffe ich habe mein Problem halbewegs verständlich dargestellt.
Gruß
Django - nachträgliche Erweiterung der base.html
Deine Ausführungen lassen vermuten, dass du eigentlich fragen möchtest, wie du zusätzliche Daten in den Context bekommst, den du dem Renderer des Templates übergibst.
Und die Antwort darauf ist leider nicht pauschal möglich. Es kommt darauf an, wie sich der Inhalt je View verändert.
Die Antwort könnte ein eigener ContextProcessor oder ein eignes Templatetag sein.
Und die Antwort darauf ist leider nicht pauschal möglich. Es kommt darauf an, wie sich der Inhalt je View verändert.
Die Antwort könnte ein eigener ContextProcessor oder ein eignes Templatetag sein.
-
- User
- Beiträge: 72
- Registriert: Samstag 28. Januar 2023, 20:19
- Wohnort: Nähe Wien
- Kontaktdaten:
Funktionsaufrufe sind in den Standard-Django-Templates nicht möglich. Das Lesen aus der Datenbank muss daher außerhalb des Templates gemacht werden.
Ich habe in einem Projekt Folgendes gemacht:
DB-Zugriff in einer Helper-Klasse namens ContextBundle.
Das ContextBundle-Objekt enthält die auszugebende Info aus der Datenbank und kann bei Bedarf später um weitere Elemente erweitert werden.
Ich habe in einem Projekt Folgendes gemacht:
DB-Zugriff in einer Helper-Klasse namens ContextBundle.
Das ContextBundle-Objekt enthält die auszugebende Info aus der Datenbank und kann bei Bedarf später um weitere Elemente erweitert werden.
Code: Alles auswählen
# Auszug aus Function Based View
context = {
"bundle": ContextBundle(),
...
}
return TemplateResponse(request, template, context)
Und ContextBundle ist eine Klasse? Das klingt ein bisschen so, als würdest du eine Klasse als Funktionscontainer verwenden. Das wäre fragwürdig.
Und ist dein Beispiel jetzt die Lösung für dein Problem? Denn dann müsstest du ja doch jeden View anfassen um dieses Bundle da rein zu bringen.
Wirkt so als hättest du dir da kompliziert etwas gebaut, was eigentlich ein ContextProcessor tut.
Funktionsaufrufe sind Django Templates möglich. Über die Filter bzw. template tags.
Deshalb auch die Aussage aus meinem letzten Post: Es kommt drauf an, was dort jedesmal in dem Template gerendert werden soll.
Und ist dein Beispiel jetzt die Lösung für dein Problem? Denn dann müsstest du ja doch jeden View anfassen um dieses Bundle da rein zu bringen.
Wirkt so als hättest du dir da kompliziert etwas gebaut, was eigentlich ein ContextProcessor tut.
Funktionsaufrufe sind Django Templates möglich. Über die Filter bzw. template tags.
Deshalb auch die Aussage aus meinem letzten Post: Es kommt drauf an, was dort jedesmal in dem Template gerendert werden soll.
Ich danke euch für die Hilfestellung.
Ein eigenes templatetag wäre vermutlich die Lösung meines Problems. Wie ich das sehe, werde ich mich allerdings auf die Schnelle nicht in das Thema einarbeiten können. Daher ist die Änderung sämtlicher views für den Monent zumindest die schnellere und einfachere Lösung. Auch wenn mir das nicht gefällt.
Im nächsten Projekt werde ich den Vorschlag von geraldflo in Betracht ziehen und eine helperFunktion gleich von Anfang an einbinden. Das scheint mir recht sinnvoll, falls sich nachträglich Ergänzungen ergeben.
Um mal konkret zu werden: im aktuellen Projekt habe ich Jahreszahlen in der Datenbank, welche im Header einer jeden Seite angezeigt werden müssen. Also vom Prinzip her recht simpel, wenn man es von Anfang an umgesetzt hätte.
Gruß
Ein eigenes templatetag wäre vermutlich die Lösung meines Problems. Wie ich das sehe, werde ich mich allerdings auf die Schnelle nicht in das Thema einarbeiten können. Daher ist die Änderung sämtlicher views für den Monent zumindest die schnellere und einfachere Lösung. Auch wenn mir das nicht gefällt.
Im nächsten Projekt werde ich den Vorschlag von geraldflo in Betracht ziehen und eine helperFunktion gleich von Anfang an einbinden. Das scheint mir recht sinnvoll, falls sich nachträglich Ergänzungen ergeben.
Um mal konkret zu werden: im aktuellen Projekt habe ich Jahreszahlen in der Datenbank, welche im Header einer jeden Seite angezeigt werden müssen. Also vom Prinzip her recht simpel, wenn man es von Anfang an umgesetzt hätte.
Gruß
@guhamail: Wie ich beschrieb klingt die Lösung von geraldflo versdächtig danach, dass hier ein ContextProcessor kompliziert nachgebaut wird. Das ist unnötig umständlich bis falsch.
Das Einarbeiten ist ja nicht so umfangreich. Die Stelle in der Dokumentation hat alle Infos direkt am Anfang und es dauert ungefähr 2 Minuten das zu lesen.
Und hier gibt es eine recht gute und kurze Erklärung, wie man einen ContextProcessor implementiert. Und das beschreibt exakt dein Problem.
Das Einarbeiten ist ja nicht so umfangreich. Die Stelle in der Dokumentation hat alle Infos direkt am Anfang und es dauert ungefähr 2 Minuten das zu lesen.
Und hier gibt es eine recht gute und kurze Erklärung, wie man einen ContextProcessor implementiert. Und das beschreibt exakt dein Problem.
Ok, ich habe mich heute damit mal näher auseinandergesetzt.
Die Doku mit dem Custom tags hatte ich mir gestern schon mal angeschaut. Hat mich allerdings irgendwie mehr verwirrt als weiter geholfen. Ich hätte nicht so viel lesen sollen, sondern einfach mal ausprobieren
Mit Hilfe der Tutorials auf dev.to (hätte ich mal schon früher entdecken sollen) bin ich jetzt aber ganz gut zurecht gekommen und habe den ContextProcessor sowie die Custom tags mal an einem Testprojekt umgesetzt. Mein Problem ist damit gelöst, ich werde mir einen ContextProcessor in meinem Projekt erstellen und fertig.
Vielen Dank für die Hilfe.
Gruß
Die Doku mit dem Custom tags hatte ich mir gestern schon mal angeschaut. Hat mich allerdings irgendwie mehr verwirrt als weiter geholfen. Ich hätte nicht so viel lesen sollen, sondern einfach mal ausprobieren

Mit Hilfe der Tutorials auf dev.to (hätte ich mal schon früher entdecken sollen) bin ich jetzt aber ganz gut zurecht gekommen und habe den ContextProcessor sowie die Custom tags mal an einem Testprojekt umgesetzt. Mein Problem ist damit gelöst, ich werde mir einen ContextProcessor in meinem Projekt erstellen und fertig.
Vielen Dank für die Hilfe.
Gruß