Django TemplateDoesNotExist?

163

Mesin lokal saya menjalankan Python 2.5 dan Nginx di Ubuntu 8.10, dengan Django dibangun dari trunk pengembangan terbaru.

Untuk setiap URL yang saya minta, ia melempar:

TemplateDoesNotExist di / appname / path appname / template_name.html

Django mencoba memuat template ini, dalam urutan ini: * Menggunakan loader django.template.loaders.filesystem.function: * Menggunakan loader django.template.loaders.app_directories.function:

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

Apakah ia mencari /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html dalam kasus ini? Yang aneh adalah file ini memang ada di disk. Mengapa Django tidak dapat menemukannya?

Saya menjalankan aplikasi yang sama di server jauh dengan Python 2.6 di Ubuntu 9.04 tanpa masalah seperti itu. Pengaturan lainnya sama.

Apakah ada sesuatu yang salah konfigurasi pada mesin lokal saya, atau apa yang mungkin menyebabkan kesalahan seperti yang harus saya perhatikan?

Di settings.py saya , saya telah menentukan:

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

Itu harus mencari file-file berikut:

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

Semua file di atas ada di disk.

Terpecahkan

Ini berfungsi sekarang setelah saya mencoba:

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

Ini aneh. Saya tidak perlu melakukan ini di server jauh untuk membuatnya bekerja.

mendongkrak
sumber
apakah TEMPLATE_DIRS Anda dapat dibaca oleh server web?
Jordan Messina
@Jordan, TEMPLATE_DIRS dapat diakses oleh root sudah cukup. Ini yang dikonfigurasi pada server jarak jauh yang berfungsi.
jack

Jawaban:

197

Solusi pertama :

Pengaturan ini

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

berarti bahwa Django akan melihat template dari templates/direktori di bawah proyek Anda.

Dengan asumsi proyek Django Anda terletak pada /usr/lib/python2.5/site-packages/projectname/saat itu dengan pengaturan Anda Django akan mencari template di bawah/usr/lib/python2.5/site-packages/projectname/templates/

Jadi dalam hal ini kami ingin memindahkan template kami menjadi terstruktur seperti ini:

/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

Solusi kedua :

Jika itu masih tidak berhasil dan dengan asumsi bahwa Anda memiliki aplikasi yang dikonfigurasi di settings.py seperti ini:

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

Secara default Django akan memuat template di bawah templates/direktori di bawah setiap aplikasi yang diinstal. Jadi dengan struktur direktori Anda, kami ingin memindahkan template kami menjadi seperti ini:

/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_PATHmungkin tidak didefinisikan secara default. Dalam hal ini, Anda ingin mendefinisikannya (di settings.py):

import os
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))
Joshua Partogi
sumber
3
@jpartogi, saya mencoba kedua pendekatan tetapi tidak berhasil. Saya bahkan mencoba menggunakan path absolut ke template dalam argumen render_to_response () tetapi masih tidak berhasil.
jack
Apakah proyek Django Anda di bawah /usr/lib/python2.5/site-packages/projectname/?
Joshua Partogi
@jpartogi, ya, semua aplikasi yang diinstal berada di bawah /usr/lib/python2.5/site-packages/projectname/appname1, ...
jack
Bisakah Anda mengedit posting asli Anda dan rekatkan settings.py. Tidak termasuk DB Config: -d. Terima kasih.
Joshua Partogi
Menempatkan setiap template dari aplikasi yang berbeda dalam satu direktori templatesbukanlah desain yang baik. Tapi, seperti yang saya tahu, setelah menambahkan Anda APP_NAMEdi settings.py, djangomungkin pergi untuk mencari templat aplikasi di bawah direktori yang di bawah APP_DIR. Dengan demikian, Anda dapat memisahkan templat untuk berbagai aplikasi. (Django 1.7 - .1.9
Alston
59

Temukan tuple ini:

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

Anda perlu menambahkan ke 'DIRS' string

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

Jadi sama sekali yang Anda butuhkan:

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
sumber
24
SETTINGS_PATHsebenarnya tidak didefinisikan di mana pun, jadi saya tidak berpikir bahwa jawaban ini akan berfungsi. Mungkin maksud AndaBASE_DIR
lembut
1
define SETTINGS_PATH = os.path.dirname (os.path.dirname ( file ))
Shapon Pal
1
Saya pikir Pal Shapon berarti SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)), bukan file
mic
20

Jika Anda mengalami masalah ini saat Anda menambahkan appdari awal. Mungkin karena Anda melewatkan beberapa settings. Tiga langkah diperlukan saat menambahkan app.

1 、 Buat direktori dan file templat.

Misalkan Anda memiliki proyek bernama mysitedan Anda ingin menambahkan appnama your_app_name. Letakkan file template Anda di bawah mysite/your_app_name/templates/your_app_namesebagai berikut.

├── 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 、 Tambahkan appke INSTALLED_APPS.

Memodifikasi settings.py

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

3 、 Tambahkan appdirektori Anda ke DIRSdalam TEMPLATES.

Ubah settings.py.

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]
W.Perrin
sumber
Ini adalah satu-satunya solusi yang berfungsi untuk saya menggunakan Django 2.2.7
Jhonatas Kleinkauff
1
Dalam kasus saya hanya langkah 2 yang hilang. array DIRS saya dapat membiarkannya kosong dan masih berfungsi dan mencari templat di direktori templat aplikasi yang tepat.
Shri Shinde
13

Dalam pengaturan .py hapus TEMPLATE_LOADERS dan TEMPLATE DIRS Lalu 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
sumber
5

Saya memiliki masalah yang memalukan ...

Saya mendapatkan kesalahan ini karena saya terburu-buru dan lupa memasukkan aplikasi INSTALLED_APPS. Anda akan berpikir Django akan meningkatkan kesalahan yang lebih deskriptif.

Chris Conlan
sumber
4

Hanya firasat, tetapi periksa artikel ini tentang memuat template Django . Secara khusus, pastikan Anda memiliki django.template.loaders.app_directories.Loaderdaftar TEMPLATE_LOADERS Anda.

Peter Rowell
sumber
Ini berhasil untuk saya. Memuat template dari aplikasi Django di sistem file. Untuk setiap aplikasi di INSTALLED_APPS, pemuat mencari subdirektori templat. Jika direktori ada, Django mencari template di sana. <br> TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': Benar,}]
Vijay
4

Periksa izin pada templat dan direktori appname, baik dengan ls -l atau coba lakukan path absolut terbuka () dari Django.

Kemper
sumber
4

Ini berfungsi sekarang setelah saya mencoba

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

Ini aneh. Saya tidak perlu melakukan ini di server jauh untuk membuatnya bekerja.

Juga, saya harus menjalankan perintah berikut pada mesin lokal untuk membuat semua file statis dapat diakses tetapi pada server jauh mereka semua "root: root".

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

Mesin lokal berjalan pada edisi desktop Ubuntu 8.04. Server jarak jauh ada pada edisi server Ubuntu 9.04.

Adakah yang tahu mengapa?

mendongkrak
sumber
4

Untuk versi Django 1.9, saya menambahkan

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

baris ke blok Templates di settings.py Dan itu bekerja dengan baik

Kapilfreeman
sumber
3

TemplateDoesNotExistKesalahan Django berarti bahwa kerangka kerja tidak dapat menemukan file templat.

Untuk menggunakan API pemuatan templat, Anda harus memberi tahu kerangka kerja tempat Anda menyimpan templat. Tempat untuk melakukan ini ada di file pengaturan Anda ( settings.py) olehTEMPLATE_DIRS pengaturan. Secara default ini adalah tuple kosong, jadi pengaturan ini memberi tahu mekanisme memuat template Django ke mana harus mencari templat.

Pilih direktori tempat Anda ingin menyimpan template Anda dan menambahkannya ke TEMPLATE_DIRS misalnya:

TEMPLATE_DIRS = (
  '/home/django/myproject/templates',
)
kenorb
sumber
1

Lihat folder mana Django mencoba memuat tampilan template Template-loader postmortemdi halaman kesalahan, misalnya, kesalahan akan terlihat seperti ini:

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)

Dalam kesalahan saya vcsrc\vcsrc\templates\base.htmltidak ada di jalur.
Kemudian ubah TEMPLATESdi setting.pyfile path template Anda

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

Saya harus menggunakan templat untuk aplikasi internal dan berfungsi untuk saya:

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

Pastikan Anda telah menambahkan aplikasi ke project-name/app-namme/settings.py INSTALLED_APPS: .

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

Dan pada project-name/app-namme/settings.py TEMPLATES: .

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

Periksa apakah templates.html Anda dalam /usr/lib/python2.5/site-packages/projectname/templatesdirektori.

Juanjo Conti
sumber
0

Hai teman-teman, saya menemukan solusi baru. Sebenarnya itu didefinisikan dalam template lain jadi alih-alih mendefinisikan TEMPLATE_DIRS sendiri, letakkan nama path direktori Anda di: masukkan deskripsi gambar di sini

Amit
sumber
0

Saya malu mengakui hal ini, tetapi masalahnya bagi saya adalah bahwa templat telah ditentukan sebagai ….hmlganti ….html. Awas!

kokociel
sumber
0

Saya menambahkan ini

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

dan masih menunjukkan kesalahan, maka saya menyadari bahwa di proyek lain template ditampilkan tanpa menambahkan kode itu dalam file settings.py jadi saya memeriksa proyek itu dan saya menyadari bahwa saya tidak membuat lingkungan virtual dalam proyek ini jadi saya melakukannya

virtualenv env 

dan itu berhasil, tidak tahu mengapa

Keval
sumber
0

Saya datang dengan masalah ini. Inilah cara saya memecahkan ini:

Lihatlah pengaturan Anda .py, cari TEMPLATESvariabel, di dalam TEMPLATES, tambahkan path template Anda di dalam DIRSdaftar. Bagi saya, pertama-tama saya menetapkan jalur templat saya sebagai TEMPLATES_PATH = os.path.join(BASE_DIR,'templates'), lalu menambahkan TEMPLATES_PATHke DIRSdaftar 'DIRS':[TEMPLATES_PATH,],. Kemudian restart server, pengecualian TemplateDoesNotExist hilang. Itu dia.

imcaozi
sumber
0

di setting.pyfile Anda ganti DIRSdalam TEMPLATESarray dengan ini

'DIRS': []

untuk ini

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

tetapi saya pikir Anda perlu tahu adalah bahwa Anda harus membuat folder dengan nama templates dan itu harus di jalur root jika tidak, Anda harus mengubah DIRSnilai

Krishna Kumar Jangid
sumber
0

1. buat folder 'templat' di 'aplikasi' Anda (katakanlah Anda memberi nama aplikasi seperti itu) dan Anda dapat meletakkan file html di sini. Tetapi sangat disarankan untuk membuat folder dengan nama yang sama ('app') di folder 'templates' dan hanya kemudian meletakkan html di sana. Ke dalam folder 'app / templates / app'

2. sekarang di urls.py 'app' menempatkan:

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

3. di put 'app''s views.py:

from django.shortcuts import render 

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