我的本地机器运行Python 2.5和Ubuntu 8.10上的Nginx, Django是根据最新的开发主干构建的。
对于我请求的每个URL,它抛出:
TemplateDoesNotExist at /appname/path appname/template_name.html
Django尝试加载这些模板,顺序如下:
使用loader django.template.loaders. filessystem .function:
使用loader django.template.loaders.app_directories.function:
TEMPLATE_DIRS
(“/ usr / lib / python2.5 /网站/ projectname /模板”,)
在这种情况下,它是否在寻找/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 /模板/ appname1 / template1.html
/usr/lib/python2.5/site-packages projectname /模板/ appname1 / template2.html
/usr/lib/python2.5/site-packages projectname /模板/ appname2 / template3.html
...
以上所有文件都存在于磁盘上。
解决了
在我尝试之后,它现在工作了:
chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*
这是奇怪的。我不需要在远程服务器上执行此操作即可使其工作。
在模板:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [r'C:\Users\islam\Desktop\html_project\django\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',
],
},
},
]
将模板文件的完整目录放在视图中:
def home(request):
return render(request, "home\index.html")
启动模板后面的HTML文件路径
简而言之:
完整路径为:
django C:\Users\islam\Desktop\ html_project \ \ templates \ \ index . html
django C:\Users\islam\Desktop\ html_project \ \模板
模板文件的完整路径将在TEMPLATES ` DIRS': [' ']
Home \index.html模板后面的路径将在render()中显示
在模板:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [r'C:\Users\islam\Desktop\html_project\django\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',
],
},
},
]
将模板文件的完整目录放在视图中:
def home(request):
return render(request, "home\index.html")
启动模板后面的HTML文件路径
简而言之:
完整路径为:
django C:\Users\islam\Desktop\ html_project \ \ templates \ \ index . html
django C:\Users\islam\Desktop\ html_project \ \模板
模板文件的完整路径将在TEMPLATES ` DIRS': [' ']
Home \index.html模板后面的路径将在render()中显示
第一个解决方案:
这些设置
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会在每个已安装应用的模板/目录下加载模板。所以在你的目录结构中,我们想要移动我们的模板,就像这样:
/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__))
在我的情况下,只要将我的应用程序包含在settings.py文件中的INSTALLED_APPS中就足够了:
INSTALLED_APPS = [
"myapp",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
]
另外,记住模板应该像这样放在你的目录中:
myapp /模板/ myapp / template_name.html
但是当你指向这个模板时,你可以这样做:
Template = loader.get_template("myapp/template_name.html")