17

我有一个看起来很常见的初学者问题。

我正在处理我的第一个 django 项目,当我设置视图时,出现“TemplateDoesNotExist”错误。我现在花了很多时间在这上面 - 我知道有很多关于它的主题,但到目前为止没有任何帮助。

我希望我可以提供所有需要的信息,以便高级 django 用户可以直接看到我做错了什么。

我正在使用开发服务器。和 windows 7 & sqlite3。

这是我得到的错误:

TemplateDoesNotExist at /skates/
allsk8s.html
Request Method: GET
Request URL:    http://127.0.0.1:8000/skates/
Django Version: 1.4.3
Exception Type: TemplateDoesNotExist

在 settings.py 我这样设置 TEMPLATE_DIRS :

TEMPLATE_DIRS = (
    r'H:/netz2/skateprojekt/templates/',
)

模板加载器如下所示:

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

这是我的观点:

from django.shortcuts import render_to_response
from django.template import RequestContext
from sk8.models import Sk8

def AllSk8s(request):
    skates      = Sk8.objects.all().order_by('name')
    context     = {'skates':skates}
    return render_to_response('allsk8s.html', context, context_instance=RequestContext(request))

它应该链接到 allsk8s.html - 看起来确实如此,但找不到该文件,尽管它肯定位于正确的文件夹中。但如您所见:

Template-loader postmortem
Django tried loading these templates, in this order:
Using loader django.template.loaders.filesystem.Loader:
H:\netz2\skateprojekt\templates\allsk8s.html (File does not exist)

这是我的 urls.py 的一部分

    urlpatterns = patterns('',
         url(r'^admin/', include(admin.site.urls)),
         (r'^skates/$', 'sk8.views.AllSk8s'),
 )

这是系统路径:

H:\netz2\skateproject\templates

并且在模板文件夹中有一个名为 allsk8s.html 的文件,据我所知 - 这应该可以。我真的希望有人能帮助我,因为这是我第二次遇到这样的问题,我无法弄清楚问题所在。

在此先感谢丹尼尔


编辑:

我尝试将此添加到我的 settings.py 中:

import os
DIRNAME = os.path.abspath(os.path.dirname(__file__))

并将我的 TEMPLATE_DIRS 更改为:

TEMPLATE_DIRS = (
    os.path.join(DIRNAME, r'H:/netz2/skateprojekt/templates/'),
)

因为我读过它会有所帮助 - 但它仍然返回相同的错误 - 所以我再次将它改回来。;(


编辑:

另外,我检查过,当我输入错误的网址时,它会引发此错误:

Using the URLconf defined in skateproject.urls, Django tried these URL patterns, in this order:
^admin/
^skates/$

所以溜冰鞋的网址应该在那里-但不能“解决”-我不明白:(


编辑:

我今天发现了一些新东西,Template-loader postmortem 说它还会检查这些目录:

Using loader django.template.loaders.app_directories.Loader:
C:\Python27\lib\site-packages\django\contrib\auth\templates\allsk8s.html (File does not exist)
C:\Python27\lib\site-packages\django\contrib\admin\templates\allsk8s.html (File does not exist)

所以我将我的模板文件移到那里并收到一个新错误 - 通过将我的 html 文件从 ansi 转换为 utf8 和 tada 解决了这个问题 - 它有效。不幸的是,我不能让这个文件夹中的模板文件导致它不是项目的一部分。当我将文件移回原始位置时,我又回到了旧错误:(

4

8 回答 8

15

此问题的解决方案之一是您应该在 settings.py 中添加应用程序。我假设您有一个名为发票的应用程序,那么解决方案是

INSTALLED_APPS = [
'invoice.apps.InoviceConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
于 2016-04-01T07:33:08.227 回答
9

神的圣洁母亲!我解决了!

我不知道为什么 - 但这是“TemplateDoesNotExist”错误的解决方案(在我的情况下)。

我的文件夹结构是这样的:

netz2 > 滑板项目

到目前为止,我在skateproject 和settings.py 中有templates 文件夹,我指向了这个目录。当我尝试在 Firefox 中打开页面时,这引发了模板不存在错误。

因为skateproject 是那里的项目文件夹,所以我有一个文件夹sk8 - 这是我目前正在处理的应用程序,我正在尝试执行。解决方案非常简单。

我不得不在应用程序的子目录中移动模板。看起来像这样

netz2 > 滑板项目 > sk8 > 模板

现在它可以工作了!

因此,如果您有同样的问题,请确保您的模板文件夹不在项目的根目录中,而是您正在处理的应用程序的子目录 - 并将此路径添加到 settings.py Template_dirs

在我的示例中看起来像这样:

TEMPLATE_DIRS = (
    r'H:/netz2/skateprojekt/sk8/templates/',
)
于 2013-01-04T16:49:46.897 回答
9

如果有人用 Django 1.7 和 Python 3 或更高版本尝试这个,我这样做了:

TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'mysite_dir/templates')]

其中 myfile_dir 可以是 mysite 下的任何目录。文件结构将是这样的:

manage.py
mysite/  
  mysite/  
  mysite_dir/  
  templates/  
    ____init__.py  
    models.py  
    #...
  another_app/  

这个答案可能看起来很重复,但我知道我总是喜欢从最近的日期看到事情......所以希望这会有所帮助

于 2014-11-29T02:27:30.750 回答
3

我为类似的问题苦苦挣扎了好几个小时,发现如果我使用模板将模板放在应用程序内的 /templates 子目录中,我可以加载模板。您甚至不需要在 settings.py 中设置 TEMPLATE_DIRS,该文件会自动找到。不幸的是,TemplateDoesNotExist 异常不是很具有描述性,在某些情况下确实是错误的。如果您在 Template-loader postmortem 中看到类似于以下内容的内容:

Django tried loading these templates, in this order:
Using loader django.template.loaders.filesystem.Loader:
/Users/me/mysite/myapp/index.html

并且文件路径对于您尝试加载的模板看起来是正确的,文件可能存在但无法访问。尝试将其移动到应用程序的 /templates 子目录。

于 2013-01-08T03:51:44.213 回答
3

如果您遵循 Django 的文档,他们建议对模板进行命名空间,在模板下,您在模板之前有 / yourapp /。见这里

所以你的结构可能看起来像:

Project Folder
--Project
--yourapp
  --templates
    --yourapp
      --layout.html

但他们不清楚的是,对这些模板的任何硬编码引用(例如,渲染函数)也需要在这些模板前面加上您的应用程序名称!我以为 Django 正在为我们进行递归搜索,但我给了它太多的信任。您需要指向确切的链接。

例如

return render(request, "login.html")

return render(request, "orders/login.html")

在任何扩展语句或使用静态链接到文件的地方,您可能也需要这个。

于 2019-10-23T16:21:59.167 回答
0

只需将源根目录中模板目录的路径粘贴到项目设置 dirs 变量中即可。它应该看起来像这样

    'DIRS': [
        'templates'
    ],
于 2021-10-22T14:56:51.527 回答
0

对我来说{% include 'some.html' %}是抛出这个错误。确保包括前导./,例如: {% include './some.html' %}

于 2020-08-17T16:29:00.833 回答
-8

只需在 Django 设置文件中将 DEBUG 设置为 false

于 2016-02-29T17:37:14.573 回答