django& “TemplateDoesNotExist”错误

时间:2013-01-04 02:37:37

标签: django django-templates

我有一个似乎常见的初学者问题。

我正在开发我的第一个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来解决这个问题 - 它有效。 不幸的是,我不能让这个文件夹中的模板文件导致它不属于项目的一部分。当我将文件移回原始位置时,我又回到了原来的错误:(

7 个答案:

答案 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