Was ist der beste Ort, um Vorlagen in ein Django-Projekt einzufügen?

87

Was ist der beste Ort, um Vorlagen in ein Django-Projekt einzufügen?

Vishal
quelle

Antworten:

50

Aus dem Django-Buch, Kapitel 4 :

Wenn Sie sich keinen offensichtlichen Ort für das Einfügen Ihrer Vorlagen vorstellen können, empfehlen wir, ein Vorlagenverzeichnis in Ihrem Django-Projekt zu erstellen (dh in dem in Kapitel 2 erstellten MySite-Verzeichnis, wenn Sie unseren Beispielen gefolgt sind).

Genau das mache ich und hat für mich großartig funktioniert.

Meine Verzeichnisstruktur sieht ungefähr so ​​aus:

/mediafür alle meine CSS / JS / Bilder usw.
/templatesfür meine Vorlagen
/projectnamefür den Hauptprojektcode (dh den Python-Code)

Dominic Rodger
quelle
Gibt es eine Möglichkeit, den Vorlagenladeprogramm beim Einfügen der Vorlagen in / templates anzuweisen, sie zu laden, ohne den vollständigen Pfad zu / template in TEMPLATE_DIRS anzugeben, der mit django.template.loaders.filesystem.Loader geladen werden soll? Es wäre großartig, dies mit einem relativen Pfad zu tun, und unter 1.4 sucht mein Lader nicht unter <Projekt> / Vorlagen
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
86

Platziert <PROJECT>/<APP>/templates/<APP>/template.htmlfür app-spezifische Vorlagen, um die App an anderer Stelle wiederverwendbar zu machen.

Für allgemeine "globale" Vorlagen habe ich sie eingefügt <PROJECT>/templates/template.html

Vertrauen
quelle
11
Fragen Sie sich den Grund für 2 <APP>s in <PROJECT>/<APP>/templates/<APP>/template.html?
David Xia
18
Die erste / app / templates dient lediglich dazu, Vorlagen mit der entsprechenden App zu gruppieren. Die zweite App soll Namenskollisionen verhindern. (Vermutlich zeigen Sie mit TEMPLATE_DIRS auf jedes dieser Verzeichnisse, aber am Ende fasst
Ceasar Bautista
3
Damit dies funktioniert (Django 1.6), musste ich eine Direktive für den Dateisystem-Template-Loader hinzufügen:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
Fafaman
3
Diese Antwort ist uralt, aber irgendwie bin ich hier gelandet. Für die Aufzeichnung ist TEMPLATE_DIRSveraltet jetzt - Sie sollten stattdessen hinzufügen DIRS=[os.path.join(BASE_DIR, "templates")]zu TEMPLATES- siehe stackoverflow.com/questions/29725132/...
John Aaron
9

Nach Dominic und Dlrust

Wir verwenden eine Setuptools-Quelldistribution (sdist), um unser Django-Projekt und unsere Apps für die Bereitstellung in unseren verschiedenen Umgebungen zu verpacken.

Wir haben festgestellt, dass sich die Vorlagen und statischen Dateien in den Django-Anwendungsverzeichnissen befinden müssen, damit sie von setuptools gepackt werden können.

Unsere Vorlagen und statischen Pfade sehen beispielsweise folgendermaßen aus:

PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js

Damit dies funktioniert, muss MANIFEST.in geändert werden (siehe http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template ).

Ein Beispiel für MANIFEST.in:

include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg

Außerdem müssen Sie in Ihrer Django-Einstellungsdatei bestätigen, dass sich der App_Directories- Loader in Ihren TEMPLATE_LOADERS befindet. Ich denke, es ist standardmäßig in Django 1.4 vorhanden.

Ein Beispiel für die Vorlagenlader für Django-Einstellungen:

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

Nur für den Fall, dass Sie sich fragen, warum wir sdists verwenden, anstatt nur rsync-Dateien zu kopieren. Es ist Teil unseres Konfigurationsmanagement-Workflows, in dem wir einen einzelnen Build-Tarball haben, der mit PIP unverändert in Test-, Akzeptanz- und Produktionsumgebungen bereitgestellt wird.

der Surfanalyst
quelle
1
+1 Vielen Dank für die Bereitstellung der zusätzlichen Details und Beispielzeilen.
Gotgenes
+1 intelligent, um /static/in Ihren Layoutplan aufgenommen zu werden, wenn Sie an Vorlagen und modulare Apps denken. Vielleicht möchten Sie eine andere bewährte Methode erwähnen, indem Sie cssDateien in einen Ordner legen , der static/app/cssebenfalls für jsund vielleicht jpgoder nur aufgerufen wird /static/app/images.
Kochfelder
7

DJANGO 1.11

Fügen Sie einen Vorlagenordner hinzu, in dem die Datei "manage.py" vorhanden ist. Dies ist Ihr Basisverzeichnis. Ändern Sie die DIRS für TEMPLATES wie folgt in Ihrer settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates')],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
},

]]

Um nun die Vorlage mithilfe des Codes zu verwenden,

def home(request):
    return render(request,"index.html",{})

in views.py. Dies funktioniert völlig gut für Django 1.11

Alan Paul
quelle
1

Dies ist eher eine persönliche Entscheidung auf Projektebene. Wenn Sie über Apps sprechen, die steckbar sein müssen, ist ein Vorlagenverzeichnis in Ihrer App der Ort, an dem sie standardmäßig verwendet werden. Aber projektweit funktioniert es am besten für Sie.

SleighBoy
quelle
1

Ich habe verstanden, TEMPLATE_DIRSerfordert einen absoluten Weg. Und ich mag keine absoluten Pfade in meinem Code. Das funktioniert also gut für mich in settings.py:

import os

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(os.path.realpath(__file__)),
                 "../APPNAME/templates")
)
kqw
quelle
1
Django-Projekte haben ihren BASE_DIRos.path.join(BASE_DIR, '../APPNAME/templates')
Basispfad
1

Django 1.10

TEMPLATE_DIRS ist veraltet.

Jetzt müssen wir Folgendes verwenden TEMPLATE: Einführung in Django 1.8 :

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]

Nachdem Sie TEMPLATES definiert haben, können Sie ALLOWED_INCLUDE_ROOTS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_DIRS, TEMPLATE_LOADERS und TEMPLATE_STRING_IF_INVALID sicher entfernen.

Über den besten Ort, Django auf der Suche nach Vorlage wie folgt:

  • DIRS definiert eine Liste von Verzeichnissen, in denen die Engine in Suchreihenfolge nach Vorlagenquelldateien suchen soll.
  • APP_DIRS gibt an , ob die Engine in installierten Anwendungen nach Vorlagen suchen soll. Jedes Backend definiert einen herkömmlichen Namen für das Unterverzeichnis in Anwendungen, in denen seine Vorlagen gespeichert werden sollen.

Weitere Informationen: https://docs.djangoproject.com/de/1.10/topics/templates/#configuration

Wilfried
quelle
0

Die vorherige Lösung hat in meinem Fall nicht funktioniert. Ich benutzte:

TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
user6916739
quelle
Schau meine Antwort. TEMPLATE_DIRSist jetzt veraltet.
Wilfried
Django-Projekte haben ihren BASE_DIRos.path.join(BASE_DIR, '../myapp/templates')
Basispfad
0

Sie können auch in Betracht ziehen, Ihre Vorlagen mithilfe von django-dbtemplates in einer Datenbank zu speichern . Es ist auch für das Caching und die Django-Reversion-Anwendung eingerichtet, mit der Sie alte Versionen Ihrer Vorlagen beibehalten können.

Es funktioniert ganz gut, aber ich würde etwas mehr Flexibilität beim Importieren / Synchronisieren zum / vom Dateisystem bevorzugen.

[Bearbeiten: 20. August 2018 - Dieses Repository ist nicht verfügbar. Eines mit demselben Namen ist unter https://github.com/jazzband/django-dbtemplates verfügbar und wurde vor 8 Monaten aktualisiert. Ich benutze Django nicht mehr in irgendeiner sinnvollen Weise, kann also nicht dafür bürgen.]

TonyM
quelle
Wann wäre das eine gute Idee? Ist es nicht langsamer, Vorlagen aus der Datenbank zu laden?
Jguffey
Werden Sie nicht abhängig von DB, wenn Sie Vorlagen in DB Plus speichern? Werden Sie Ihre DB zu einem Teil von Git Commits machen? Wie werden Sie zwischen den Änderungen koordinieren, die von verschiedenen Benutzern in den Vorlagen vorgenommen wurden?
Gautamaggarwal
Dies wurde geschrieben, bevor ich auf git aufmerksam wurde. Ich bin mir nicht mal sicher, ob ich zu diesem Zeitpunkt svn verwendet habe. Ich würde empfehlen, jetzt Versionskontrollsysteme zu verwenden.
TonyM
@tonemcd, dieses Repository wurde gelöscht.
lmiguelvargasf