[django] Django TemplateDoesNotExist?

내 로컬 머신은 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 = (
    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__))


답변

이 튜플을 찾으십시오.

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


답변

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


답변

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


답변

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

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


답변

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


답변

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