Django TemplateDoesNotExist?


163

Yerel makinem Ubuntu 8.10'da Python 2.5 ve Nginx kullanıyor, Django en son geliştirme gövdesinden üretildi.

İstediğim her URL için atar:

/ Appname / path appname / template_name.html konumunda TemplateDoesNotExist

Django, bu şablonları şu sırayla yüklemeyi denedi: * Django.template.loaders.filesystem.function yükleyicisini kullanma: * Django.template.loaders.app_directories.function yükleyicisini kullanma:

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

Bu durumda /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html mi arıyor ? Garip olan şey bu dosyanın diskte mevcut olmasıdır. Django neden bulamıyor?

Aynı uygulamayı Ubuntu 9.04'te Python 2.6 ile uzak bir sunucuda böyle bir sorun olmadan çalıştırıyorum. Diğer ayarlar aynı.

Yerel makinemde yanlış yapılandırılmış bir şey var mı veya bakmam gereken bu tür hatalara neden olan ne olabilir?

Benim settings.py , ben belirttim:

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

Aşağıdaki dosyaları aramalıdır:

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

Yukarıdaki tüm dosyalar diskte bulunur.

çözülmüş

Denedikten sonra şimdi çalışıyor:

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

Bu garip. Çalışması için bunu uzak sunucuda yapmam gerekmiyor.


TEMPLATE_DIRS web sunucusu tarafından okunabilir mi?
Jordan Messina

@Jordan, TEMPLATE_DIRS kök tarafından erişilebilir yeterlidir. Çalışan uzak sunucuda yapılandırdığı şey budur.
jack

Yanıtlar:


197

İlk çözüm :

Bu ayarlar

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

Django'nun templates/projeniz altındaki dizinden şablonlara bakacağı anlamına gelir .

Django projenizin o sırada bulunduğu varsayıldığında, /usr/lib/python2.5/site-packages/projectname/django aşağıdaki şablonları arayacaktır/usr/lib/python2.5/site-packages/projectname/templates/

Bu durumda, şablonlarımızı şu şekilde yapılandırılmak üzere taşımak istiyoruz:

/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

İkinci çözüm :

Bu hala işe yaramazsa ve settings.py dosyasında şu şekilde yapılandırılmış uygulamalara sahip olduğunuzu varsayarsa:

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

Varsayılan olarak Django, templates/yüklü her uygulamanın altındaki şablonları dizin altında yükler . Dizin yapınızla, şablonlarımızı şu şekilde taşımak istiyoruz:

/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_PATHvarsayılan olarak tanımlanmamış olabilir. Bu durumda, tanımlamak isteyeceksiniz (settings.py'de):

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

3
@jpartogi, her iki yaklaşımı da denedim ama ikisi de işe yaramıyor. Hatta render_to_response () argümanında şablon için mutlak yol kullanmaya çalıştım ama yine de işe yaramadı.
jack

Django projeniz altında /usr/lib/python2.5/site-packages/projectname/mı?
Joshua Partogi

@jpartogi, evet, yüklü tüm uygulamalar /usr/lib/python2.5/site-packages/projectname/appname1, ... altında
jak

Lütfen orijinal yayınınızı düzenleyebilir ve settings.py'yi yapıştırabilir misiniz? DB Config hariç: -d. Teşekkürler.
Joshua Partogi

Farklı uygulamalardaki her şablonu bir dizine koymak templatesiyi bir tasarım değildir. Ancak bildiğim kadarıyla, sayfanı ekledikten sonra APP_NAMEiçinde settings.py, djangoaltında dizin altında uygulamanın şablonunu aramak için gidebilir APP_DIR. Böylece, şablonu çeşitli uygulama için ayırabilirsiniz. (Django 1.7 - .1.9
Alston

59

Bu parçayı bulun:

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

Dizeye 'DIRS' eklemeniz gerekiyor

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

Yani tamamen ihtiyacınız var:

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_PATHaslında hiçbir yerde tanımlanmamıştır, bu yüzden bu cevabın işe yarayacağını sanmıyorum. Belki demek BASE_DIR
istediniz

1
tanımla SETTINGS_PATH = os.path.dirname (os.path.dirname ( dosya ))
Shapon Pal

1
Bence Shapon Pal demek SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))değil, dosya
mikrofon

20

appSıfırdan bir eklediğinizde bu sorunla karşılaşırsanız . Muhtemelen bazılarını kaçırmanızdır settings. Bir eklerken üç adım gereklidir app.

1 directory Dizin ve şablon dosyasını oluşturun.

Adlı bir proje olduğunu varsayalım mysiteve bir eklemek istediğiniz appadlandırılmış your_app_name. Şablon dosyanızı mysite/your_app_name/templates/your_app_nameaşağıdaki gibi yerleştirin.

├── 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, senin ekle appTo INSTALLED_APPS.

Değiştir settings.py

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

3 senin ekleyin appdizin DIRSiçinde TEMPLATES.

Değiştir settings.py.

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

Bu benim için django 2.2.7 kullanarak çalışan tek çözüm oldu
Jhonatas Kleinkauff

1
Benim durumumda sadece 2. adım eksikti. DIRS dizisini boş bırakabilirdim ve yine de çalıştı ve uygulamanın sağ şablonlar dizinindeki şablonu aradı.
Shri Shinde

13

.Py ayarı olarak kaldırma TEMPLATE_LOADERS ve TEMPLATE DIRS Ardından 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

Utanç verici bir sorunum vardı ...

Bu hatayı aldım çünkü acele ediyordum ve uygulamayı koymayı unuttum INSTALLED_APPS. Django'nun daha açıklayıcı bir hata oluşturacağını düşünürdünüz.


4

Sadece bir önsezi, ancak Django şablon yüklemesi hakkındaki bu makaleye göz atın . Özellikle django.template.loaders.app_directories.LoaderTEMPLATE_LOADERS listenizde olduğundan emin olun .


Bu benim için çalıştı. Dosya sistemindeki Django uygulamalarından şablonlar yükler. INSTALLED_APPS içindeki her uygulama için yükleyici bir şablon alt dizini arar. Dizin varsa, Django orada şablon arar. <br> TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': Doğru,}]
Vijay

4

Şablonlar ve uygulama adı dizinlerindeki izinleri ls -l ile kontrol edin veya django'dan open () mutlak yolunu kullanmayı deneyin.


4

Denedikten sonra şimdi çalışıyor

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

Bu garip. Çalışması için bunu uzak sunucuda yapmam gerekmiyor.

Ayrıca, tüm statik dosyaları erişilebilir hale getirmek için yerel makinede aşağıdaki komutu çalıştırmak zorunda ama uzak sunucuda hepsi "root: root".

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

Yerel makine Ubuntu 8.04 masaüstü sürümünde çalışır. Uzak sunucu Ubuntu 9.04 sunucu sürümündedir.

Nedenini bilen var mı?


4

Django 1.9 sürümü için ekledim

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

settings.py içindeki Templates bloğuna satır ve iyi çalıştı


3

Django TemplateDoesNotExisthatası, çerçevenin şablon dosyasını bulamadığı anlamına gelir.

Şablon yükleme API'sını kullanmak için çerçeveye şablonlarınızı nerede sakladığınızı söylemeniz gerekir. Bunun yapılacağı yer, ayarlar dosyanızda ( settings.py) TEMPLATE_DIRSayarlanarak yapılır. Varsayılan olarak boş bir gruptur, bu nedenle bu ayar Django'nun şablon yükleme mekanizmasına şablonları nerede arayacağını bildirir.

Şablonlarınızı saklamak istediğiniz bir dizin seçin ve TEMPLATE_DIRS dizinine ekleyin örn.

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

1

Template-loader postmortemHata sayfasında şablon görünümüne hangi klasör django'yu yüklemeye çalıştığına bakın, örneğin hata aşağıdaki gibi olacaktır:

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)

Benim hatam vcsrc\vcsrc\templates\base.htmlyolunda değil.
Ardından TEMPLATES, setting.pydosyayı şablon yolunuza değiştirin

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

1

Dahili bir APP için şablonlar kullanmalıyım ve benim için çalışıyor:

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

1

Yap emin uygulamanızı ekledik project-name/app-namme/settings.py INSTALLED_APPS: .

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

Ve üzerinde project-name/app-namme/settings.py şablonlar: .

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

0

Templates.html dosyanızın /usr/lib/python2.5/site-packages/projectname/templatesdir.


0

Merhaba arkadaşlar yeni bir çözüm buldum. Aslında başka bir şablonda tanımlanmıştır, bu nedenle TEMPLATE_DIRS'i kendiniz tanımlamak yerine, dizin yolu adınızı şuralara koyun: resim açıklamasını buraya girin


0

Kabul etmek çok mahcup ediyorum, ama benim için sorun bir şablon olarak belirtilen olmasıydı ….hmlyerine ….html. Dikkat et!


0

Bunu ekledim

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

ve yine de hatayı gösterdi, sonra başka bir projede, settings.py dosyasına bu kodu eklemeden şablonların gösterildiğini fark ettim, bu yüzden bu projeyi kontrol ettim ve bu projede sanal bir ortam oluşturmadığımı fark ettim.

virtualenv env 

ve işe yaradı, neden bilmiyorum


0

Bu problemle karşılaştım. İşte bunu nasıl çözdüm:

Settings.py ayarlarınıza bakın, TEMPLATESdeğişkeni bulun , ŞABLONLAR'ın içine, şablon yolunuzu DIRSlisteye ekleyin . Benim için, ilk benim şablonları yolu ayarlayın TEMPLATES_PATH = os.path.join(BASE_DIR,'templates'), ardından eklemek TEMPLATES_PATHiçine DIRSlistede, 'DIRS':[TEMPLATES_PATH,]. Sonra sunucuyu yeniden başlatın, TemplateDoesNotExist özel durumu gitti. Bu kadar.


0

sizin de setting.pydosyada yerini DIRSde TEMPLATESbununla dizide

'DIRS': []

buna

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

ama 1 bilmeniz gerekir düşünüyorum adıyla bir klasör yapmak templates zorunda ve kök yolunda aksi takdirde u DIRSdeğerini değiştirmek zorunda


0

1. 'uygulamanızda' şablonlar 'klasörü oluşturun (uygulamanızı böyle adlandırdığınızı varsayalım) ve html dosyasını buraya koyabilirsiniz. Ancak 'şablonlar' klasöründe aynı ada ('uygulama') sahip bir klasör oluşturmanız ve oraya htmls koymanız önemle tavsiye edilir. 'App / templates / app' klasörüne

'App' s urls.py koymak 2.now koymak:

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

3. 'app' görünümünde.

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.