Django TemplateDoesNotExist?


163

내 로컬 머신은 Ubuntu 8.10에서 Python 2.5 및 Nginx를 실행 중이며 최신 개발 트렁크에서 Django가 빌드되었습니다.

내가 요청하는 모든 URL에 대해 다음을 throw합니다.

/ appname / path appname / template_name.html의 TemplateDoesNotExist

Django는 다음 순서로 이러한 템플릿을로드하려고 시도했습니다. * 로더 django.template.loaders.filesystem.function 사용 : * 로더 django.template.loaders.app_directories.function 사용 :

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

이 경우 /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html 을 찾고 있습니까? 이상한 것은이 파일이 디스크에 존재한다는 것입니다. Django가 왜 그것을 찾을 수 없습니까?

그런 문제없이 Ubuntu 9.04에서 Python 2.6을 사용하여 원격 서버에서 동일한 응용 프로그램을 실행합니다. 다른 설정은 동일합니다.

로컬 컴퓨터에 잘못 구성된 것이 있습니까? 아니면 내가 조사해야 할 오류를 일으킬 수있는 것은 무엇입니까?

내에서 settings.py , 내가 지정한 :

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

다음 파일을 찾아야합니다.

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

위의 모든 파일은 디스크에 존재합니다.

해결

내가 시도한 후에 지금 작동합니다.

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

이상하다. 원격 서버 에서이 작업을 수행 할 필요가 없습니다.


웹 서버에서 TEMPLATE_DIRS를 읽을 수 있습니까?
Jordan Messina

@Jordan, 루트로 액세스 가능한 TEMPLATE_DIRS이면 충분합니다. 작동하는 원격 서버에서 구성 된 것입니다.
jack

답변:


197

첫 번째 해결책 :

이 설정

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

Django는 templates/프로젝트 아래의 디렉토리에서 템플릿을 볼 것임을 의미합니다 .

장고 프로젝트가 /usr/lib/python2.5/site-packages/projectname/설정 에 있다고 가정하면 django는 아래에서 템플릿을 찾습니다./usr/lib/python2.5/site-packages/projectname/templates/

이 경우 템플릿을 다음과 같이 구성하도록 옮깁니다.

/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

두 번째 해결책 :

그래도 작동하지 않고 settings.py에 앱을 구성했다고 가정하면 다음과 같습니다.

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

Django는 기본적으로 templates/설치된 모든 앱의 디렉토리 아래에 템플릿을로드합니다 . 따라서 디렉토리 구조를 사용하여 템플릿을 다음과 같이 이동하려고합니다.

/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_PATH기본적으로 정의되어 있지 않을 수 있습니다. 이 경우 settings.py에서 정의하고 싶을 것입니다.

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

3
@ jpartogi, 나는 두 가지 접근법을 모두 시도했지만 둘 다 작동하지 않았습니다. 심지어 render_to_response () 인수에서 템플릿의 절대 경로를 사용하려고했지만 여전히 작동하지 않았습니다.
jack

django 프로젝트가 아래에 /usr/lib/python2.5/site-packages/projectname/있습니까?
Joshua Partogi 2009

@jpartogi, 예. 설치된 모든 앱은 /usr/lib/python2.5/site-packages/projectname/appname1에 있습니다.
jack

원본 게시물을 수정하고 settings.py를 붙여 넣을 수 있습니까? DB 구성 제외 : -d. 감사.
Joshua Partogi 2009

다른 앱의 모든 템플릿을 하나의 디렉토리 templates에 두는 것은 좋은 디자인이 아닙니다. 내가 아는 그러나, 당신을 추가 한 후 APP_NAMEsettings.py, django아래에있는 디렉토리에 응용 프로그램의 템플릿을 검색 갈 수 있습니다 APP_DIR. 따라서 다양한 앱의 템플릿을 분리 할 수 ​​있습니다. (Django 1.7-.1.9
Alston

59

이 튜플을 찾으십시오.

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

문자열을 'DIRS'에 추가해야합니다.

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

그래서 당신은 모두 필요합니다 :

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_PATH실제로 어디에도 정의되어 있지 않으므로이 답변이 효과가 있다고 생각하지 않습니다. 아마 당신은 의미BASE_DIR
sofly

1
SETTINGS_PATH 정의 = os.path.dirname (os.path.dirname ( file ))
Shapon Pal

1
Shapon Pal은 파일이SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)) 아니라, 의미가 있다고 생각 합니다
mic

20

app처음부터 추가 할 때이 문제가 발생하는 경우 아마 당신이 일부를 그리워하기 때문일 것입니다 settings. 을 추가 할 때는 세 단계가 필요합니다 app.

1, 디렉토리 및 템플릿 파일을 만듭니다.

라는 이름의 프로젝트가 있다고 가정 mysite하고 당신이 추가 할 app이름 your_app_name. 템플릿 파일 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, 귀하의 추가 app에를 INSTALLED_APPS.

수정 settings.py

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

3, 귀하의 추가 app로 디렉토리 DIRS에서 TEMPLATES.

수정 settings.py.

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

이 장고 2.2.7 사용 나를 위해 작동하는 유일한 솔루션이었다
Jhonatas Kleinkauff

1
제 경우에는 2 단계 만 누락되었습니다. DIRS 배열을 비워 둘 수 있었고 여전히 작동하고 앱의 올바른 템플릿 디렉토리에서 템플릿을 찾았습니다.
Shri Shinde

13

.py 설정에서 TEMPLATE_LOADERS 및 TEMPLATE DIRS를 제거한 다음 추가

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

부끄러운 문제가있었습니다 ...

서두르고 앱을에 넣는 것을 잊었 기 때문에이 오류가 발생했습니다 INSTALLED_APPS. 장고가 더 설명적인 오류를 일으킬 것이라고 생각할 것입니다.


4

직감이지만 Django 템플릿 로딩에 대한이 기사를 확인하십시오 . 특히, django.template.loaders.app_directories.LoaderTEMPLATE_LOADERS 목록에 있는지 확인하십시오 .


이것은 나를 위해 일했습니다. 파일 시스템의 Django 앱에서 템플릿을로드합니다. INSTALLED_APPS의 각 앱에 대해 로더는 템플릿 하위 디렉토리를 찾습니다. 디렉토리가 존재하면 Django는 거기에서 템플릿을 찾습니다. <br> 템플릿 = [{ 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True,}]
Vijay

4

ls -l을 사용하여 템플리트 및 appname 디렉토리에 대한 권한을 확인하거나 django에서 절대 경로 open ()을 시도하십시오.


4

시도한 후에 지금 작동합니다.

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

이상하다. 원격 서버 에서이 작업을 수행 할 필요가 없습니다.

또한 로컬 컴퓨터에서 다음 명령을 실행하여 모든 정적 파일에 액세스 할 수 있지만 원격 서버에서는 모두 "root : root"입니다.

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

로컬 컴퓨터는 Ubuntu 8.04 데스크톱 에디션에서 실행됩니다. 원격 서버는 Ubuntu 9.04 서버 에디션에 있습니다.

왜 그 이유를 아는 사람이 있습니까?


4

장고 버전 1.9의 경우 추가했습니다.

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

settings.py의 Templates 블록 줄에


3

장고 TemplateDoesNotExist오류는 단순히 프레임 워크가 템플릿 파일을 찾을 수 없음을 의미합니다.

템플릿 로딩 API를 사용하려면 템플릿을 저장할 위치를 프레임 워크에 알려야합니다. 이 작업을 수행 할 위치는 설정에 따라 설정 파일 ( settings.py)에 TEMPLATE_DIRS있습니다. 기본적으로 빈 튜플이므로이 설정은 Django의 템플릿 로딩 메커니즘에 템플릿을 찾을 위치를 알려줍니다.

템플릿을 저장할 디렉토리를 선택하고 TEMPLATE_DIRS에 추가하십시오. 예 :

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

1

django Template-loader postmortem가 오류 페이지 에서 템플릿 모양을로드하려고 시도하는 폴더를 확인하십시오. 예를 들어 error는 다음과 같습니다.

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)

내 오류 vcsrc\vcsrc\templates\base.html가 경로에 없습니다.
그런 다음 변경 TEMPLATESsetting.py템플릿 경로에 파일

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

1

내부 APP에 템플릿을 사용해야하며 나에게 효과적입니다.

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

1

project-name/app-namme/settings.py INSTALLED_APPS :에 앱을 추가했는지 확인하십시오 .

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

그리고 project-name/app-namme/settings.py 템플릿 : .

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

0

templates.html이 /usr/lib/python2.5/site-packages/projectname/templatesdir 인지 확인하십시오 .


0

안녕하세요, 저는 새로운 해결책을 찾았습니다. 실제로 다른 템플리트에 정의되어 있으므로 TEMPLATE_DIRS를 직접 정의하는 대신 디렉토리 경로 이름을 다음 위치에 두십시오. 여기에 이미지 설명을 입력하십시오


0

이것을 인정하기가 부끄럽지만, 문제는 템플릿 ….hml대신으로 템플릿이 지정되었다는 것입니다 ….html. 조심해!


0

나는 이것을 추가했다

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

그리고 여전히 오류를 보여준 다음 다른 프로젝트에서 settings.py 파일에 코드를 추가하지 않고 템플릿이 표시되고 있음을 깨달았습니다. 그래서 프로젝트를 확인 하고이 프로젝트에서 가상 환경을 만들지 않았다는 것을 깨달았습니다.

virtualenv env 

효과가 있었는데 왜 그런지 모르겠다


0

나는이 문제를 생각해 냈습니다. 내가 이것을 해결 한 방법은 다음과 같습니다.

settings.py를보고 TEMPLATESTEMPLATES 내에서 변수를 찾은 다음 DIRS목록 내에 템플릿 경로를 추가하십시오 . 나를 위해, 먼저 내 템플릿 경로를 설정 TEMPLATES_PATH = os.path.join(BASE_DIR,'templates')한 후 추가 TEMPLATES_PATHDIRS목록 'DIRS':[TEMPLATES_PATH,]. 그런 다음 서버를 다시 시작하면 TemplateDoesNotExist 예외가 사라집니다. 그게 다야.


0

당신의 setting.py파일 대신 DIRSTEMPLATES이와 배열

'DIRS': []

이에

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

그러나 1 알아야 할 것은 이름이있는 폴더를 만들어야 templates 하고 루트 경로에 있어야한다는 것입니다. 그렇지 않으면 DIRS값 을 변경해야 합니다


0

1. '앱'에 '템플릿'폴더를 만들고 (앱 이름을 지정하십시오) 여기에 html 파일을 넣을 수 있습니다. 그러나 'templates'폴더에 동일한 이름 ( 'app')으로 폴더를 만든 다음 html 만 넣는 것이 좋습니다. 'app / templates / app'폴더로

2. 'app'의 urls.py에 넣으십시오.

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

3. 'app'의 views.py에서 :

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.