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.

Jacek
źródł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__))
Joshua Partogi
źródło
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',
            ],
        },
    },
]
Bacs
źródło
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'),
                ...
                ]
    }
]
W.Perrin
źródło
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',
        ],
    },
 },
]
jayant singh
źródło
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.

Chris Conlan
źródło
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.

Peter Rowell
źródło
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.

kibitzer
źródło
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?

Jacek
źródło
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

Kapilfreeman
źródło
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',
)
kenorb
źródło
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')], 
        ...
nguyên
źródło
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')],
Diego Cortes
źródło
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')],
Murdock Helscream
źródło
0

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

Juanjo Conti
źródło
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

Amit
źródło
0

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

kokociel
źródło
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

Keval
źródło
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.

imcaozi
źródło
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ść

Krishna Kumar Jangid
źródło
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
CodeToLife
źródło