Antworten:
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)
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
<APP>s in <PROJECT>/<APP>/templates/<APP>/template.html?
TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
TEMPLATE_DIRSveraltet jetzt - Sie sollten stattdessen hinzufügen DIRS=[os.path.join(BASE_DIR, "templates")]zu TEMPLATES- siehe stackoverflow.com/questions/29725132/...
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.
/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.
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
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")
)
BASE_DIRos.path.join(BASE_DIR, '../APPNAME/templates')
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:
Weitere Informationen: https://docs.djangoproject.com/de/1.10/topics/templates/#configuration
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") ]
TEMPLATE_DIRSist jetzt veraltet.
BASE_DIRos.path.join(BASE_DIR, '../myapp/templates')
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.]