2009-03-11 2 views
2

Ich arbeite mit einer Satchmo-Installation, die sich in einem bestehenden Projekt befindet. Dieses Projekt hat seine eigenen Vorlagen sowie Vorlagen für einige der verschiedenen installierten Apps. Einige dieser App-spezifischen Vorlagen haben ihre eigenen Variationen von app_base.html, die das Formular base.html ableiten. Ich würde gerne in der Lage sein, das gleiche mit meinen Satchmo-Vorlagen zu tun und sie in der Basis meines Projekts zu haben, aber auch etwas zusätzliches HTML, das um alle von ihnen hinzugefügt wird.Wie können Projektvorlagen und Satchmo-Vorlagen gleichzeitig erstellt werden?

  • /templates
    • base.html
    • index.html
    • /news
      • news_base.html (erweitert base.html und fügt Nachrichten spezifische Template-Features)
      • index.html
      • detail.html
    • /store
      • base.html (zwingende Satchmo-Base)

Diese Struktur funktioniert etwas, aber nicht, wie ich erwartet hatte. in /store/base.html (Satchmos Basis) Ich habe einfach alles durch eine Testnachricht ersetzt. Ich kann die Nachricht sehen, also weiß ich, dass satchmo seine Basis lädt und nicht die Basis der Seite. Allerdings kann ich nicht mein Projekt Basis erstrecken mehr, da die Verwendung:

{% extends "base.html %} 

ergibt eine Rekursionsfehlers seit seiner selbst aufrufen und die folgenden einfach nicht funktionieren.

{% extends "../base.html" %} 

Ich weiß, dass ich mein Projekt base.html zu einem etwas anderen Namen ändern und zeigen alle App-spezifische Vorlagen bei ihnen, aber es scheint wie ein ziemlich großen Hack auf einem solchen grundlegenden Aspekt der Template-Struktur .

Antwort

0

Hmm, ich hätte nicht gedacht, Django sah Vorlagen so ähnlich nach.

Kinda verrückt Hack, aber dies sollte funktionieren:

  • /templates/store/base.html erweitert "global_base.html"
  • /templates/global_base.html erweitert "base.html"
0

Je nachdem, wie Sie Ihre Template-Struktur aufgebaut haben, kann es auch sein, gute Idee, mit den settings.TEMPLATE_LOADERS Variablen zu spielen.

TEMPLATE_LOADERS Standard: ('django.template.loaders.filesystem.load_template_source', 'django.template.loaders.app_directories.load_template_source') Ein Tupel von Callables (als Strings), dass wissen, wie man Importvorlagen aus verschiedenen Quellen.Siehe The Django Vorlage Sprache: Für Python Programmierer.

Weitere Informationen darüber, wie dies wirkt sich auf die Vorlage Ladevorgang: http://docs.djangoproject.com/en/dev/ref/templates/api/#loader-types

Von der Art und Weise Sie Ihr Problem beschreiben, wie es scheint, durch die „app_directories.load_template_source“ Dateizeile Kommentierung aus, könnten Sie zu sein in der Lage, besser einen Weg zu finden, um das zu erreichen, was Sie tun.

django.template.loaders.app_directories.load_template_source Laden Vorlagen von Django apps auf das Dateisystem. Für jede App in INSTALLED_APPS sucht der Loader nach einem Templates-Unterverzeichnis. Wenn das Verzeichnis existiert, sucht Django nach Vorlagen dort.

Das bedeutet, dass Sie Vorlagen mit Ihren individuellen Anwendungen speichern können. Dies ist auch macht es einfach, Django Apps mit Standardvorlagen zu verteilen.

Zum Beispiel für diese Einstellung:

INSTALLED_APPS = ('myproject.polls', 'myproject.music') ... dann get_template ('foo.html') für Vorlagen aussehen in diese Verzeichnisse, in dieser Reihenfolge:

/path/to/myproject/polls/templates/foo.html /path/to/myproject/music/templates/foo.html Beachten Sie, dass der Lader eine Optimierung durchführt wenn es zuerst importiert wird: Es speichert eine Liste von denen INSTALLED_APPS-Pakete haben ein Templates-Unterverzeichnis.

Dieser Loader ist standardmäßig aktiviert.

0

Ich hatte gerade das gleiche Problem. Es sieht so aus, als ob die satchmo-Entwickler dies geplant hätten, indem sie eine "leere" Basis in das Shop-Template-Verzeichnis gelegt hätten. Auch wenn dies für Sie nicht mehr relevant ist, hätte ich das hier gerne gesehen.

Sie können ein "Shop" -Verzeichnis in Ihrem Vorlagenverzeichnis erstellen und das Haupt-satchmo base.html in dieses Verzeichnis kopieren.

Das funktionierte für mich.