Django TemplateDoesNotExist?

162

Auf meinem lokalen Computer werden Python 2.5 und Nginx unter Ubuntu 8.10 ausgeführt, wobei Django aus dem neuesten Entwicklungs-Trunk erstellt wurde.

Für jede angeforderte URL wird Folgendes ausgegeben:

TemplateDoesNotExist unter / appname / path appname / template_name.html

Django hat versucht, diese Vorlagen in der folgenden Reihenfolge zu laden: * Verwenden des Loaders django.template.loaders.filesystem.function: * Verwenden des Loaders django.template.loaders.app_directories.function:

TEMPLATE_DIRS ('/usr/lib/python2.5/site-packages/projectname/templates',)

Sucht es in diesem Fall nach /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html ? Das Seltsame ist, dass diese Datei auf der Festplatte vorhanden ist. Warum kann Django es nicht finden?

Ich führe dieselbe Anwendung auf einem Remote-Server mit Python 2.6 unter Ubuntu 9.04 ohne ein solches Problem aus. Andere Einstellungen sind gleich.

Ist auf meinem lokalen Computer etwas falsch konfiguriert, oder was könnte möglicherweise solche Fehler verursacht haben, die ich untersuchen sollte?

In meiner settings.py habe ich angegeben:

SETTINGS_PATH = os.path.normpath(os.path.dirname(__file__))
# Find templates in the same folder as settings.py.
TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

Es sollte nach folgenden Dateien suchen:

  • /usr/lib/python2.5/site-packages/projectname/templates/appname1/template1.html
  • /usr/lib/python2.5/site-packages/projectname/templates/appname1/template2.html
  • /usr/lib/python2.5/site-packages/projectname/templates/appname2/template3.html
  • ...

Alle oben genannten Dateien befinden sich auf der Festplatte.

Gelöst

Es funktioniert jetzt, nachdem ich versucht habe:

chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

Es ist komisch. Ich muss dies nicht auf dem Remote-Server tun, damit es funktioniert.

Jack
quelle
Ist Ihr TEMPLATE_DIRS für den Webserver lesbar?
Jordan Messina
@ Jordan, TEMPLATE_DIRS, auf das über root zugegriffen werden kann, ist ausreichend. Es ist das, was auf dem Remote-Server konfiguriert ist, der funktioniert.
Jack

Antworten:

195

Erste Lösung :

Diese Einstellungen

TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

bedeutet, dass Django die Vorlagen aus dem templates/Verzeichnis unter Ihrem Projekt betrachtet.

Angenommen, Ihr Django-Projekt befindet sich /usr/lib/python2.5/site-packages/projectname/dann mit Ihren Einstellungen. Django sucht nach den Vorlagen unter/usr/lib/python2.5/site-packages/projectname/templates/

In diesem Fall möchten wir unsere Vorlagen so verschieben, dass sie wie folgt strukturiert sind:

/usr/lib/python2.5/site-packages/projectname/templates/template1.html
/usr/lib/python2.5/site-packages/projectname/templates/template2.html
/usr/lib/python2.5/site-packages/projectname/templates/template3.html

Zweite Lösung :

Wenn das immer noch nicht funktioniert und vorausgesetzt, Sie haben die Apps in settings.py wie folgt konfiguriert:

INSTALLED_APPS = (
    'appname1',
    'appname2',
    'appname3',
)

Standardmäßig lädt Django die Vorlagen templates/unter allen installierten Apps im Verzeichnis. Mit Ihrer Verzeichnisstruktur möchten wir unsere Vorlagen so verschieben, dass sie folgendermaßen aussehen:

/usr/lib/python2.5/site-packages/projectname/appname1/templates/template1.html
/usr/lib/python2.5/site-packages/projectname/appname2/templates/template2.html
/usr/lib/python2.5/site-packages/projectname/appname3/templates/template3.html

SETTINGS_PATHist möglicherweise nicht standardmäßig definiert. In diesem Fall möchten Sie es definieren (in settings.py):

import os
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))
Joshua Partogi
quelle
3
@jpartogi, ich habe beide Ansätze ausprobiert, aber keiner funktioniert. Ich habe sogar versucht, den absoluten Pfad zur Vorlage im Argument render_to_response () zu verwenden, aber es hat immer noch nicht funktioniert.
Jack
Ist Ihr Django-Projekt unter /usr/lib/python2.5/site-packages/projectname/?
Joshua Partogi
@jpartogi, ja, alle installierten Apps befinden sich unter /usr/lib/python2.5/site-packages/projectname/appname1, ...
jack
Können Sie bitte Ihren ursprünglichen Beitrag bearbeiten und die settings.py einfügen? Ohne DB-Konfiguration: -d. Vielen Dank.
Joshua Partogi
Es templatesist kein gutes Design , jede Vorlage aus verschiedenen Apps in einem Verzeichnis abzulegen. Aber, wie ich weiß, nach der Zugabe APP_NAMEin der settings.py, djangovielleicht geht die App-Vorlage unter dem Verzeichnis zu suchen , die unter dem ist APP_DIR. So können Sie die Vorlage für verschiedene Apps trennen. (Django 1.7 - .1.9
Alston
59

Finden Sie dieses Tupel:

    import os
    SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            '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',
                ],
            },
        },
    ]

Sie müssen die Zeichenfolge zu 'DIRS' hinzufügen

"os.path.join(SETTINGS_PATH, 'templates')"

Insgesamt brauchen Sie also:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(SETTINGS_PATH, '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',
            ],
        },
    },
]
Bacs
quelle
24
SETTINGS_PATHist eigentlich nirgendwo definiert, daher denke ich nicht, dass diese Antwort funktionieren wird. Vielleicht meinten SieBASE_DIR
leise
1
definiere SETTINGS_PATH = os.path.dirname (os.path.dirname ( Datei ))
Shapon Pal
1
Ich denke, Shapon Pal bedeutet SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)), nicht Datei
Mikrofon
20

Wenn Sie auf dieses Problem stoßen, wenn Sie ein appvon Grund auf neu hinzufügen . Es ist wahrscheinlich, weil Sie einige vermissen settings. Beim Hinzufügen eines sind drei Schritte erforderlich app.

1 、 Erstellen Sie das Verzeichnis und die Vorlagendatei.

Angenommen, Sie haben ein Projekt mit dem Namen mysiteund möchten ein appbenanntes hinzufügen your_app_name. Fügen Sie Ihre Vorlagendatei mysite/your_app_name/templates/your_app_namewie folgt ein.

├── mysite
   ├── settings.py
   ├── urls.py
   └── wsgi.py
├── your_app_name
   ├── admin.py
   ├── apps.py
   ├── models.py
   ├── templates
      └── your_app_name
          └── my_index.html
   ├── urls.py
   └── views.py

2 、 Fügen Sie Ihre appzu INSTALLED_APPS.

Ändern settings.py

INSTALLED_APPS = [
    ...
    'your_app_name',
    ...
]

3 、 Fügen Sie Ihr appVerzeichnis zu DIRSin hinzu TEMPLATES.

Ändern settings.py.

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]
W.Perrin
quelle
Dies war die einzige Lösung, die für mich mit Django 2.2.7
Jhonatas Kleinkauff
1
In meinem Fall fehlte nur Schritt 2. Das DIRS-Array konnte ich leer lassen und es funktionierte immer noch und suchte nach der Vorlage im richtigen Vorlagenverzeichnis der App.
Shri Shinde
13

Bei der Festlegung von Py entfernen TEMPLATE_LOADERS und TEMPLATE DIRS Dann ADD

TEMPLATES = [
 {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': ['/home/jay/apijay/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',
        ],
    },
 },
]
jayant singh
quelle
5

Ich hatte ein peinliches Problem ...

Ich habe diesen Fehler erhalten, weil ich mich beeilt habe und vergessen habe, die App einzulegen INSTALLED_APPS. Sie würden denken, Django würde einen aussagekräftigeren Fehler auslösen.

Chris Conlan
quelle
4

Nur eine Vermutung, aber lesen Sie diesen Artikel über das Laden von Django-Vorlagen . django.template.loaders.app_directories.LoaderStellen Sie insbesondere sicher, dass Sie in Ihrer TEMPLATE_LOADERS-Liste haben.

Peter Rowell
quelle
Das hat bei mir funktioniert. Lädt Vorlagen von Django-Apps in das Dateisystem. Für jede App in INSTALLED_APPS sucht der Loader nach einem Vorlagen-Unterverzeichnis. Wenn das Verzeichnis vorhanden ist, sucht Django dort nach Vorlagen. <br> TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True,}]
Vijay
4

Überprüfen Sie die Berechtigungen für Vorlagen und Appname-Verzeichnisse, entweder mit ls -l, oder versuchen Sie, einen absoluten Pfad open () von django aus zu erstellen.

Kiebitz
quelle
4

Es funktioniert jetzt, nachdem ich es versucht habe

chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

Es ist komisch. Ich muss dies nicht auf dem Remote-Server tun, damit es funktioniert.

Außerdem muss ich den folgenden Befehl auf dem lokalen Computer ausführen, um auf alle statischen Dateien zugreifen zu können, aber auf dem Remote-Server sind sie alle "root: root".

chown -R www-data:www-data /var/www/projectname/*

Der lokale Computer läuft unter Ubuntu 8.04 Desktop Edition. Der Remote-Server ist auf Ubuntu 9.04 Server Edition.

Weiß jemand warum?

Jack
quelle
4

Für die Django-Version 1.9 habe ich hinzugefügt

'DIRS': [os.path.join(BASE_DIR, 'templates')], 

Zeile zum Vorlagenblock in settings.py Und es hat gut funktioniert

Kapilfreeman
quelle
3

Django- TemplateDoesNotExistFehler bedeutet einfach, dass das Framework die Vorlagendatei nicht finden kann.

Um die API zum Laden von Vorlagen verwenden zu können, müssen Sie dem Framework mitteilen, in dem Sie Ihre Vorlagen speichern. Der Ort, an dem Sie dies tun können, befindet sich in Ihrer Einstellungsdatei ( settings.py) TEMPLATE_DIRS. Standardmäßig ist es ein leeres Tupel, daher teilt diese Einstellung Djangos Mechanismus zum Laden von Vorlagen mit, wo nach Vorlagen gesucht werden soll.

Wählen Sie ein Verzeichnis aus, in dem Sie Ihre Vorlagen speichern möchten, und fügen Sie es TEMPLATE_DIRS hinzu, z.

TEMPLATE_DIRS = (
  '/home/django/myproject/templates',
)
Kenorb
quelle
1

Sehen Sie auf der Fehlerseite, welchen Ordner Django versucht, die Vorlage zu laden. Der Template-loader postmortemFehler wird beispielsweise folgendermaßen angezeigt:

Template-loader postmortem

Django tried loading these templates, in this order:

Using engine django:
django.template.loaders.filesystem.Loader: d:\projects\vcsrc\vcsrc\templates\base.html (Source does not exist)

In meinem Fehler vcsrc\vcsrc\templates\base.htmlnicht im Weg.
Ändern Sie dann TEMPLATESin setting.pyDatei auf Ihren Vorlagen Pfad

TEMPLATES = [
    {    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
         # 'DIRS': [], 
        'DIRS': [os.path.join(BASE_DIR, 'vcsrc/templates')], 
        ...
nguyên
quelle
1

Ich muss Vorlagen für eine interne App verwenden und es funktioniert für mich:

'DIRS': [os.path.join(BASE_DIR + '/THE_APP_NAME', 'templates')],
Diego Cortes
quelle
0

Überprüfen Sie, ob sich Ihre templates.html im /usr/lib/python2.5/site-packages/projectname/templatesVerzeichnis befinden.

Juanjo Conti
quelle
0

Hallo Leute, ich habe eine neue Lösung gefunden. Tatsächlich ist es in einer anderen Vorlage definiert. Anstatt TEMPLATE_DIRS selbst zu definieren, setzen Sie Ihren Verzeichnispfadnamen auf Folgendes: Geben Sie hier die Bildbeschreibung ein

Amit
quelle
0

Es ist mir peinlich, das zuzugeben, aber das Problem für mich war, dass eine Vorlage als ….hmlanstelle von angegeben wurde ….html. Achtung!

Kokociel
quelle
0

Ich habe das hinzugefügt

TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

und es zeigte immer noch den Fehler an, dann stellte ich fest, dass in einem anderen Projekt die Vorlagen angezeigt wurden, ohne diesen Code in der Datei settings.py hinzuzufügen, also überprüfte ich dieses Projekt und stellte fest, dass ich in diesem Projekt keine virtuelle Umgebung erstellt habe

virtualenv env 

und es hat funktioniert, weiß nicht warum

Keval
quelle
0

Ich habe mir dieses Problem ausgedacht. So habe ich das gelöst:

Sehen Sie sich Ihre settings.py an TEMPLATES, suchen Sie die Variable in den TEMPLATES und fügen Sie Ihren Vorlagenpfad in die DIRSListe ein. Für mich setze ich zuerst meinen Vorlagenpfad als TEMPLATES_PATH = os.path.join(BASE_DIR,'templates')und füge ihn dann TEMPLATES_PATHin die DIRSListe ein 'DIRS':[TEMPLATES_PATH,]. Starten Sie dann den Server neu. Die TemplateDoesNotExist-Ausnahme ist nicht mehr vorhanden. Das ist es.

imcaozi
quelle
0

in Ihrer setting.pyDatei DIRSim TEMPLATESArray durch dieses ersetzen

'DIRS': []

dazu

'DIRS': [os.path.join(BASE_DIR, 'templates')],

Aber ich denke, du musst wissen, dass du einen Ordner mit Namen templates erstellen musst und er sollte sich im Stammpfad befinden, sonst musst du den DIRSWert ändern

Krishna Kumar Jangid
quelle
0

1.Erstellen Sie einen Ordner 'Vorlagen' in Ihrer 'App' (sagen wir, Sie haben Ihre App so benannt) und Sie können die HTML-Datei hier ablegen. Es wird jedoch dringend empfohlen, einen Ordner mit demselben Namen ('app') im Ordner 'templates' zu erstellen und erst dann htmls dort abzulegen. In den Ordner 'app / templates / app'

2.nun in 'url' 's urls.py setzen:

  path('', views.index, name='index'), # in case of  use default server index.html 

3. in den Ansichten der App.py setzen:

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want
CodeToLife
quelle
0

project-name/app-namme/settings.py Stellen Sie sicher, dass Sie Ihre App zu INSTALLED_APPS hinzugefügt haben : .

INSTALLED_APPS = ['app-name.apps.AppNameConfig']

Und auf project-name/app-namme/settings.py VORLAGEN : .

'DIRS': [os.path.join(BASE_DIR, 'templates')],
Murdock Helscream
quelle