我有一个似乎常见的初学者问题。
我正在开发我的第一个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
并在templates文件夹中有一个名为allsk8s.html的文件 所以据我所知 - 这应该有效。 我真的希望有人可以帮助我,因为这是我第二次遇到这样的问题,我无法弄清楚问题。
提前谢谢 danielll编辑:
我尝试将此添加到我的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/'),
)
因为我读它会有所帮助 - 但它仍然返回相同的错误 - 所以我再次改回来。 ;(
编辑:
另外,我检查过,当我输入一个wront url时,它会抛出这个错误:
Using the URLconf defined in skateproject.urls, Django tried these URL patterns, in this order:
^admin/
^skates/$
所以冰鞋网址应该在那里 - 但是不能“解决” - 我不明白:(
编辑:
我今天发现了一些新东西,模板加载器事后证明它还会检查这些目录:
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来解决这个问题 - 它有效。 不幸的是,我不能让这个文件夹中的模板文件导致它不属于项目的一部分。当我将文件移回原始位置时,我又回到了原来的错误:(
答案 0 :(得分:11)
此问题的解决方案之一是您应该在settings.py中添加应用。我假设您有一个名为诸如发票的应用程序,那么解决方案是
<?xml version="1.0" encoding="UTF-8"?>
<cus:Customizations xmlns:cus="http://www.bea.com/wli/config/customizations" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xt="http://www.bea.com/wli/config/xmltypes" xmlns:aler="http://www.bea.com/wli/monitoring/alert">
<cus:customization xsi:type="cus:EnvValueActionsCustomizationType">
<cus:description>Alertes Generals de ProxyService</cus:description>
<cus:owners>
<xt:ownerQuery>
<xt:resourceTypes>ProxyService</xt:resourceTypes>
<xt:refsToSearch xsi:type="xt:LocationRefType">
<xt:type>Folder</xt:type>
<xt:path>bus_ver/EA</xt:path>
</xt:refsToSearch>
</xt:ownerQuery>
</cus:owners>
<cus:actions>
<xt:add>
<xt:envValueType>Service SLA Alert Rule</xt:envValueType>
<xt:location>AverageResponse</xt:location>
<xt:value>
<aler:alertRule enabled="true" name="prova"> <aler:description>provades</aler:description> <aler:expirationDate>2016-03-31+02:00</aler:expirationDate>
<aler:startTime>00:00:00.000+01:00</aler:startTime>
<aler:endTime>00:05:00.000+01:00</aler:endTime>
<aler:frequency>every-time</aler:frequency>
<aler:severity>normal</aler:severity>
<aler:stopProcessing>false</aler:stopProcessing>
<aler:condition aggregation-interval="10">
<con1:monCondExpr xmlns:con1="http://xmlns.oracle.com/servicebus/monitoring/alert/condition">
<con1:function>count</con1:function>
<con1:lhs>Operation.peticionSincrona.error-count</con1:lhs>
<con1:operator>=</con1:operator>
<con1:rhs>1</con1:rhs>
</con1:monCondExpr>
</aler:condition>
<aler:alertDestination ref="bus_ver/AlertaProva"/>
</aler:alertRule>
</xt:value>
</xt:add>
</cus:actions>
</cus:customization>
</cus:Customizations>
答案 1 :(得分:9)
神圣的母亲!我解决了!
我不知道为什么 - 但这是解决“TemplateDoesNotExist”错误(在我的情况下)。
我的文件夹结构如下:
netz2&gt; skateproject
直到现在我在skateproject中有模板文件夹,在settings.py中我指向了这个目录。 当我试图在firefox中打开页面时,这个模板不存在错误。
因为skateproject是项目文件夹,我有一个文件夹sk8 - 这是我目前正在处理的应用程序,我试图执行。 解决方案非常简单。
我不得不在应用程序的子目录中移动模板。看起来像这样
netz2&gt; skateproject&gt; sk8&gt;模板
现在它有效!
因此,如果您遇到同样的问题,请确保您的模板文件夹不在项目的根目录中,但是您正在处理的应用程序的子目录 - 并将此路径添加到settings.py Template_dirs
在我的例子中看起来像这样:
TEMPLATE_DIRS = (
r'H:/netz2/skateprojekt/sk8/templates/',
)
答案 2 :(得分:8)
如果有人尝试使用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/
这个答案可能看似重复,但我知道我总是喜欢从最近的日期看到的东西...所以希望这有帮助
答案 3 :(得分:4)
我在几个小时内遇到了类似的问题,发现如果我使用模板将它放在应用程序内的/ templates子目录中,我可以加载模板。您甚至不需要在settings.py中设置TEMPLATE_DIRS,自动找到该文件。不幸的是,TemplateDoesNotExist异常不是很具描述性,在某些情况下确实是错误的。如果您在Template-loader事后看到类似于以下内容的内容:
Django tried loading these templates, in this order:
Using loader django.template.loaders.filesystem.Loader:
/Users/me/mysite/myapp/index.html
对于您尝试加载的模板,文件路径看起来正确,文件可能存在,但无法访问。尝试将其移动到应用程序的/ templates子目录。
答案 4 :(得分:0)
如果您遵循Django的文档,则建议您为模板命名,在模板下,您在模板之前再次具有/ yourapp /。参见here。
所以您的结构可能如下:
Project Folder
--Project
--yourapp
--templates
--yourapp
--layout.html
但是他们不清楚的是,对这些模板的任何硬编码引用(例如, render 函数)都需要在应用名称之前加上前缀!我以为Django正在为我们进行递归搜索,但是我对此给予了太多的赞誉。您需要指向确切的链接。
例如
return render(request, "login.html")
去
return render(request, "orders/login.html")
您可能需要在任何扩展语句中或在使用 static 链接到文件的位置使用此功能。
答案 5 :(得分:0)
对我来说{% include 'some.html' %}
抛出此错误。
确保包括前导./
,例如:
{% include './some.html' %}
答案 6 :(得分:-4)
在Django设置文件中将DEBUG设置为false