Django Templates: Blöcke nicht vererben oder umbenennen

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Hallo Forum,

entschuldigung wegen dem etwas holprigen Thementitel.
Mir kam am Wochenende folgendes Problem unter:

Ich habe in Django ein Projekt mit verschiedenen Apps. Nun benutze ich eine zusätzliche App von jemanden anderen und möchte diese in mein Projekt integrieren.
Die Templates die diese App mitbringt kann ich eigentlich ohne Änderung übernehmen, sie rendern nur die Nutzdaten, genau so wie ich sie brauche.

Die Templates der Applikation sind so angelegt, dass sich von einer app/base.html erben. Die habe ich entsprechend angepasst. Nun erbt die app/base.html von meiner base.html.

Bis hierhin hat alles wunderbar geklappt. Dumemrweise schreiben die Templates der App alle Daten in einen Block namens "body", ich selbst bräuchte sie aber in dem Block "content".

Gut, Blöcke kann man verschachtel, also habe ich in der app/base.html einen Wrapper integriert:

Code: Alles auswählen

{% block content %} {% block body %} {% endblock %} {% endblock %}
Das hat auch wunderbar funktioniert!

Dummerweise habe ich selbst in der base.html aber auch einen body-block der allerdings meistens leer bleibt. Jetzt habe ich auf der letztendlich gerenderten Seite die Daten doppelt vorhanden. Einmal, völlig korrekt dort wo der content-block ist, und zum anderen dort wo body-block ist.

Hat jemand eine Idee wie man das Problem ausräumen kann?


Ich danke für die Hilfe

Gruß
Sparrow
lunar

@sparrow: Ist es nicht am einfachsten, wenn Du in Deinen Templates die Blöcke einfach anders benennst? Also "body" statt "content" nutzt, und für "content" einfach einen anderen Namen ...
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Das funktioniert aber nur bis zu einer bestimmten Komplexität des Ganzen.
lunar

@sparrow: Deine Templates sind so komplex, dass es Dir unmöglich ist, die Blöcke umzubenennen?!
BlackJack

@lunar: Es ist halt eine Lösung die nicht skaliert. Wenn man dann noch weitere fremde Templates einbindet, muss man vielleicht auch da wieder anfangen umzubenennen. Vielleicht auch wenn die sich gegenseitig Namen überschreiben -- wo ändert man das dann? Und das Ganze setzt sich "upstream" weiter fort. Wenn sparrow jetzt umbenennt, müssten das auch Leute machen, die ihrerseits wieder auf seine Templates zurückgreifen.
lunar

@BlackJack: Der Beitrag machte den Eindruck, es handle sich um ein in sich geschlossenes Projekt, mit nur einer externen Abhängigkeit. Das klingt nicht so komplex, als dass man die eigenen Templates nicht anpassen könnte.

Wenn es allerdings nicht möglich ist, dass eigene Projekt den Vorlagen der Anwendung anzupassen, so muss man eben umgekehrt die Vorlagen der Anwendung dem Projekt anpassen und kann sie mithin nicht mehr unverändert übernehmen.
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Wenn das Projekt dafür gedacht ist, dass es bei anderen Projekten eingesetzt wird (upstream), sollte man vielleicht über Namespacing nachdenken. Übrigens ebenso wie jetzt schon der Entwickler der App, die du jetzt schon einbindest.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Hmm... also gehe ich davon aus, dass es keine technische Möglichkeit gibt?
Antworten