Django 模板不存在?
我的本地机器上运行的是Python 2.5和Nginx,操作系统是Ubuntu 8.10,Django是从最新的开发版本构建的。
每当我请求一个网址时,它都会报错:
在 /appname/path 找不到模板 appname/template_name.html
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找不到它呢?
我在一台远程服务器上运行同样的应用程序,使用的是Python 2.6和Ubuntu 9.04,没有遇到这个问题。其他设置都是一样的。
我的本地机器上是不是有什么配置错误,或者有什么可能导致这种错误的地方我应该去检查一下?
在我的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/*
这很奇怪。我在远程服务器上不需要这样做就能让它工作。
32 个回答
如果你在从零开始添加一个 app
时遇到这个问题,可能是因为你漏掉了一些 settings
设置。添加一个 app
需要三个步骤。
1、创建目录和模板文件。
假设你有一个项目叫 mysite
,你想添加一个叫 your_app_name
的 app
。你需要把模板文件放在 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
目录添加到 TEMPLATES
的 DIRS
中。
同样修改 settings.py
文件。
还需要添加 os 的导入。
import os
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
...
]
}
]
找到这个元组:
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(BASE_DIR, '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',
],
},
},
]
第一种解决方案:
这些设置
TEMPLATE_DIRS = (
os.path.join(SETTINGS_PATH, 'templates'),
)
意味着Django会在你项目的templates/
文件夹中寻找模板。
假设你的Django项目位于/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__))