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.


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__))

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',
            ],
        },
    },
]

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'),
                ...
                ]
    }
]

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',
        ],
    },
 },
]

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.


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.


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.


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?


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


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',
)

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')], 
        ...

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')],

0

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


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


0

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


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


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.


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


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

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')],
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.