Szablon DjangoDoesNotExist?


163

Na mojej lokalnej maszynie działa Python 2.5 i Nginx na Ubuntu 8.10, z Django zbudowanym z najnowszego pnia rozwojowego.

Dla każdego żądanego adresu URL generuje:

TemplateDoesNotExist w / nazwa_aplikacji / ścieżka nazwa_aplikacji / nazwa_szablonu.html

Django próbował załadować te szablony w następującej kolejności: * Używając programu ładującego django.template.loaders.filesystem.function: * Używając programu ładującego django.template.loaders.app_directories.function:

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

Czy w tym przypadku szuka /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html ? Dziwne jest to, że ten plik istnieje na dysku. Dlaczego Django nie może go zlokalizować?

Uruchamiam tę samą aplikację na zdalnym serwerze z Pythonem 2.6 na Ubuntu 9.04 bez takiego problemu. Pozostałe ustawienia są takie same.

Czy jest coś źle skonfigurowanego na moim komputerze lokalnym lub co mogło spowodować takie błędy, które powinienem sprawdzić?

W moim settings.py określiłem:

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

Powinien szukać następujących plików:

  • /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
  • ...

Wszystkie powyższe pliki znajdują się na dysku.

Rozwiązany

Działa teraz, gdy spróbowałem:

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

To dziwne. Nie muszę tego robić na serwerze zdalnym, żeby to działało.


Czy Twój TEMPLATE_DIRS może być odczytany przez serwer WWW?
Jordan Messina

@Jordan, TEMPLATE_DIRS dostępne dla roota wystarczy. To jest to, co jest skonfigurowane na zdalnym serwerze, który działa.
walet

Odpowiedzi:


196

Pierwsze rozwiązanie :

Te ustawienia

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

oznacza, że ​​Django będzie przeglądać szablony z templates/katalogu w twoim projekcie.

Zakładając, że twój projekt Django znajduje się w /usr/lib/python2.5/site-packages/projectname/tym miejscu z twoimi ustawieniami, django będzie szukał szablonów pod/usr/lib/python2.5/site-packages/projectname/templates/

W takim przypadku chcemy przenieść nasze szablony, aby miały następującą strukturę:

/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

Drugie rozwiązanie :

Jeśli to nadal nie działa i zakładając, że masz aplikacje skonfigurowane w settings.py w ten sposób:

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

Domyślnie Django ładuje szablony w templates/katalogu w każdej zainstalowanej aplikacji. W związku z twoją strukturą katalogów chcemy przenieść nasze szablony, aby wyglądały tak:

/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_PATHnie mogą być zdefiniowane domyślnie. W takim przypadku będziesz chciał to zdefiniować (w settings.py):

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

3
@jpartogi, próbowałem obu podejść, ale żadne z nich nie działa. Próbowałem nawet użyć bezwzględnej ścieżki do szablonu w argumencie render_to_response (), ale nadal nie działało.
walet

Czy Twój projekt django jest objęty /usr/lib/python2.5/site-packages/projectname/?
Joshua Partogi

@jpartogi, tak, wszystkie zainstalowane aplikacje znajdują się w /usr/lib/python2.5/site-packages/projectname/appname1, ...
jack

Czy możesz edytować swój oryginalny post i wkleić plik settings.py. Z wyłączeniem konfiguracji DB: -d. Dzięki.
Joshua Partogi

Umieszczenie każdego szablonu z różnych aplikacji w jednym katalogu templatesnie jest dobrym projektem. Ale, jak wiem, po dodaniu twojego APP_NAMEw settings.py, djangomoże przejść do przeszukiwania szablonu aplikacji w katalogu, który znajduje się w APP_DIR. W ten sposób możesz oddzielić szablon dla różnych aplikacji. (Django 1.7 - .1.9
Alston,

59

Znajdź tę krotkę:

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

Musisz dodać ciąg do „DIRS”

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

W sumie potrzebujesz:

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_PATHnie jest nigdzie zdefiniowana, więc nie sądzę, aby ta odpowiedź zadziałała. Może miałeś na myśliBASE_DIR
łagodnie

1
define SETTINGS_PATH = os.path.dirname (os.path.dirname ( plik ))
Shapon Pal

1
Myślę, że Shapon Pal oznacza SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)), nie plik
mikrofon

20

Jeśli napotkasz ten problem podczas dodawania pliku appod podstaw. Prawdopodobnie dlatego, że za niektórymi tęsknisz settings. Podczas dodawania pliku app.

1 、 Utwórz katalog i plik szablonu.

Załóżmy, że masz projekt o nazwie mysitei chcesz dodać appnazwany plik your_app_name. Umieść swój plik szablonu poniżej mysite/your_app_name/templates/your_app_name.

├── 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, dodaj appdo INSTALLED_APPS.

Modyfikować settings.py

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

3, Dodaj swój appkatalog do DIRSw TEMPLATES.

Modyfikuj settings.py.

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]

To było jedyne rozwiązanie, które działa dla mnie przy użyciu django 2.2.7
Jhonatas Kleinkauff

1
W moim przypadku brakowało tylko kroku 2. tablicę DIRS mogłem zostawić pustą i nadal działała i szukałem szablonu w odpowiednim katalogu szablonów aplikacji.
Shri Shinde

13

W ustawieniu .py usuń TEMPLATE_LOADERS i TEMPLATE DIRS Następnie 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

Miałem kłopotliwy problem ...

Wystąpił ten błąd, ponieważ spieszyłem się i zapomniałem zainstalować aplikację INSTALLED_APPS. Można by pomyśleć, że Django spowodowałoby bardziej opisowy błąd.


4

Tylko przeczucie, ale przeczytaj ten artykuł na temat ładowania szablonu Django . W szczególności upewnij się, że masz django.template.loaders.app_directories.Loaderna swojej liście TEMPLATE_LOADERS.


To zadziałało dla mnie. Ładuje szablony z aplikacji Django w systemie plików. Dla każdej aplikacji w INSTALLED_APPS program ładujący szuka podkatalogu szablonów. Jeśli katalog istnieje, Django szuka w nim szablonów. <br> TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True,}]
Vijay

4

Sprawdź uprawnienia do szablonów i katalogów appname, używając ls -l lub spróbuj wykonać bezwzględną ścieżkę open () z django.


4

Działa teraz, gdy spróbowałem

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

To dziwne. Nie muszę tego robić na serwerze zdalnym, aby to działało.

Muszę również uruchomić następujące polecenie na komputerze lokalnym, aby uzyskać dostęp do wszystkich plików statycznych, ale na serwerze zdalnym wszystkie są „root: root”.

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

Lokalna maszyna działa w wersji desktopowej Ubuntu 8.04. Serwer zdalny działa w wersji serwerowej Ubuntu 9.04.

Czy ktoś wie, dlaczego?


4

Dodałem do wersji 1.9 django

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

linia do bloku Szablony w settings.py I działało dobrze


3

TemplateDoesNotExistBłąd Django oznacza po prostu, że framework nie może znaleźć pliku szablonu.

Aby użyć interfejsu API do ładowania szablonów, musisz poinformować platformę, w której przechowujesz szablony. Miejsce, w którym można to zrobić, znajduje się w pliku ustawień ( settings.py) przez TEMPLATE_DIRSustawienie. Domyślnie jest to pusta krotka, więc to ustawienie mówi mechanizmowi ładowania szablonów Django, gdzie szukać szablonów.

Wybierz katalog, w którym chcesz przechowywać swoje szablony i dodaj go do TEMPLATE_DIRS, np .:

TEMPLATE_DIRS = (
  '/home/django/myproject/templates',
)

1

Zobacz, który folder django próbuje załadować szablon, spójrz na Template-loader postmortemstronę błędu, na przykład błąd będzie wyglądał następująco:

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)

W moim błędzie vcsrc\vcsrc\templates\base.htmlnie na ścieżce.
Następnie zmień TEMPLATESw setting.pypliku na ścieżkę szablonów

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

1

Muszę używać szablonów dla wewnętrznej aplikacji i działa dla mnie:

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

1

Upewnij się, że dodaliśmy swoją aplikację do project-name/app-namme/settings.py INSTALLED_APPS: .

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

I project-name/app-namme/settings.py szablony: .

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

0

Sprawdź, czy Twoje szablony.html są w /usr/lib/python2.5/site-packages/projectname/templateskatalogu.


0

Cześć, znalazłem nowe rozwiązanie. Właściwie jest zdefiniowany w innym szablonie, więc zamiast samodzielnie definiować TEMPLATE_DIRS, umieść nazwę ścieżki katalogu w ich: wprowadź opis obrazu tutaj


0

Wstyd mi to przyznać, ale problemem było to, że szablon został określony jako ….hmlzamiast ….html. Uważaj!


0

Dodałem to

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

i nadal pokazywał błąd, potem zdałem sobie sprawę, że w innym projekcie szablony pokazywały się bez dodawania tego kodu w pliku settings.py, więc sprawdziłem ten projekt i zdałem sobie sprawę, że nie stworzyłem wirtualnego środowiska w tym projekcie, więc zrobiłem

virtualenv env 

i zadziałało, nie wiem dlaczego


0

Wpadłem na ten problem. Oto jak to rozwiązałem:

Spójrz na swój settings.py, zlokalizuj TEMPLATESzmienną, wewnątrz SZABLONÓW, dodaj ścieżkę do szablonów wewnątrz DIRSlisty. Dla mnie, po pierwsze mogę ustawić ścieżkę jako szablony TEMPLATES_PATH = os.path.join(BASE_DIR,'templates'), a następnie dodać TEMPLATES_PATHdo DIRSlisty 'DIRS':[TEMPLATES_PATH,]. Następnie zrestartuj serwer, wyjątek TemplateDoesNotExist zniknął. Otóż ​​to.


0

w swoim setting.pypliku zamień DIRSw TEMPLATEStablicy na this

'DIRS': []

do tego

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

ale myślę, że musisz wiedzieć, że musisz utworzyć folder o nazwie templates i powinien znajdować się w ścieżce głównej, w przeciwnym razie musisz zmienić DIRSwartość


0

1. utwórz folder „szablony” w „aplikacji” (powiedzmy, że tak nazwałeś swoją aplikację) i możesz umieścić tutaj plik HTML. Jednak zdecydowanie zaleca się utworzenie folderu o tej samej nazwie („aplikacja”) w folderze „szablony” i dopiero wtedy umieszczenie w nim plików html. Do folderu „app / templates / app”

2. teraz w adresie urls.py 'app' umieść:

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

3. w pliku views.py aplikacji:

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.