[Django]Template-Variable als Platzhalter verwenden

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Hallo zusammen folgendes Problem,

ich arbeite an der Website einer Firma, die verschiedene Niederlassungen hat. Für jede Niederlassung gibt es eine eigene Website. Die Websites der einzelnen Niederlassungen unterscheiden sich aber inhaltlich bis auf die Kontaktdaten nicht, weswegen ich alle Daten aus einer zentralen Datenbank hole und zusätzlich eine Applikation für die Verwaltung der Niederlassungen angelegt habe. Funktioniert auch alles so wie ich möchte nur eine kleine Funktion hätte ich noch gerne.

Ist es irgendwie möglich Template-Variablen zu deklarieren, so dass die Firma diese als Platzhalter im Django-Admin bei der Verwaltung von Texten verwenden kann?

Sprich es wird zum Beispiel an der Seite Telefonauskunft am Text gearbeitet, der auf allen Seiten gleich erscheint. Für die Ausgabe der unterschiedlichen Telefonnummern so es aber möglich sein einen Platzhalter {{niederlassung.telefonnummer}} einzugeben.
So wie ich es probiert habe funktioniert es leider nicht, da der eingetragene Text samt Platzhalter ja in einer eigenen Template-Variable eingetragen wird.

Somit hätte man eine Template Variable in einer Template Variablen.
Hat einer eine Idee wie man das lösen könnte?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du kannst ja den im Admin eingegebenen Text mit der Template-Engine manuell rendern und diese gerenderte Version als String an das Template weitergeben, dass dann den Rest der Seite rendert und ausgibt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Und wie mache ich das mit dem manuell rendern!? Also Ansatz.

Save-Methode überschreiben und darin dann den eingegebenen Text samt Platzhaltern rendern und wieder in die Variable schreiben, die später den Text ausgibt!?

Übrigens sorry für die Auswahl des falschen Boards da habe ich mich vor lauter lauter verklickt.
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Ah mit der save-Methode überschreiben ergibt ja gar keinen Sinn, da ich ja nur eine Datenbank für mehrere Seiten verwende.

Wie wäre der Ansatz den eingegebenen Text mit der Template Engine manuell zu rendern?

Ansonsten wäre jetzt meiner Überlegung im View einfach per String-Replace Methode nach den Platzhaltern zu suchen und diese durch den jeweiligen Datensatz zu ersetzen.
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Hiermit müsste es doch gehen!?
http://docs.djangoproject.com/en/dev/ho ... te-filters

Somit hätte ich es auch nicht im view stehen.
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

OK habs mit der Methode oben hinbekommen Danke :)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich würde es so machen:

Code: Alles auswählen

from django.template import Template

class FooAdmin(admin.Model):
    def save_model(self, request, obj, form, change):
        obj.text = Template(obj.text).render(...)
        obj.save()
Ich nehme an, dass `Foo` ein Objekt beschreibt, das ein Attribut `text` hat, in dem du Templates auflösen willst, bevor du das speicherst. Das `...` gibt irgendwie den Kontext mit den möglichen Ersetzungen an. Vielleicht kannst du diese über `request` ableiten. Dort könntest du vielleicht an einer Subdomäne ableiten, welche Niederlassung es ist.

Aber vielleicht habe ich auch nur die Anforderung von ferix falsch verstanden.

Stefan
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Problem ist, dass alle Seiten von einer Datenbank ihre Texte beziehen.
Somit kommt eine Überschreibung der save_model-Methode nicht in Frage.
Sprich der Platzhalter darf nicht "in die Datenbank" gerendert werden.
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Habe es mit einem eigenen Template-Filter gelöst, was gut funktioniert hat.
Antworten