2014-12-08 104 views
1

我如何从其他应用TemplateDoesNotExist。加载静态文件和模板Django项目结构

这里产生的模板有点糊涂是我的项目结构的图片:

enter image description here

我得到这个错误:

TemplateDoesNotExist at/
home.html 

家/ views.py:

class HomeView(generic.TemplateView): 
    template_name = "home.html" 

Settings.py

STATIC_URL = '/static/' 
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"), 
    os.path.join(BASE_DIR, "home/static/home/js"), 
    os.path.join(BASE_DIR, "home/static/home/images"), 
    os.path.join(BASE_DIR, "home/static/home/css"), 
) 


TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates'), 
) 

项目的/ home/urls.py:

from django.conf.urls import patterns, url 

from home.views import HomeView 

urlpatterns = patterns('', 
    url(r'^$', HomeView.as_view(), name="home"), 
) 

项目/ urls.py

from django.conf.urls import patterns, include, url 
from django.contrib import admin 

urlpatterns = patterns('', 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'', include("home.urls", namespace="home")), 

) 

项目/模板/家庭/ index.html的

<!DOCTYPE html> 
<html> 
<head lang="en"> 
    ... 
    <!-- Fonts --> 
    <link href='http://fonts.googleapis.com/css?family=Lobster' rel='stylesheet' type='text/css'> 
    <!-- Custom CSS --> 
    <link href="{{ STATIC_URL }}boothie.css" rel="stylesheet"> 
    <!-- Custom JS--> 
    <script src="{{ STATIC_URL }}boothie.js"></script> 

    <title>Boothie</title> 
</head> 
<body> 
<div class="container"> 
    ... 
</div> 
</head> 
    {% block content %}{% endblock %} 
</body> 
</html> 

项目的/ home /模板/家/ home.html的:

{% extends index.html %} 

{% block content %} 
    ... 
    <script src="{{ STATIC_URL }}js/jquery.easing.1.3.js"></script> 
    <script src="{{ STATIC_URL }}js/boothie.js"></script> 
{% endblock %} 
+2

除非它有错字,否则你的模板被称为'home/index.html'而不是'home.html'。 – 2014-12-08 04:40:49

+0

@BurhanKhalid我在我的'家'应用程序中有一个名为home.html的文件。我想我的命名习惯很糟糕。在我的项目/模板中,有一个名为home的目录,其文件为'index.html' – Liondancer 2014-12-08 04:45:38

+0

它位于'home/templates/home.html'中吗? – 2014-12-08 04:49:08

回答

2

Django的停在它找到匹配请求的文件名的第一个模板,它会在应用程序文件夹中的templates目录启动。

如果它在这里找不到它,它会上链,直到它搜索到TEMPLATE_DIRS设置中的所有位置,然后才会打印出找不到模板的错误。它搜索模板的方式由TEMPLATE_LOADERS setting定义。

在您的项目布局中,您想要的模板位于home应用程序的模板目录中,并位于此目录下的home目录下。因此,模板路径应该是home/home.html在您的视图:

class HomeView(generic.TemplateView): 
    template_name = "home/home.html" 
+0

我做了一些修改,并添加了这个'TEMPLATE_DIRS =( os.path.join(BASE_DIR,'templates/index'), os.path。加入(BASE_DIR,'home/templates/home'), )'不知道这是否是好的做法,虽然=/ – Liondancer 2014-12-08 08:01:14

+0

不这样做,默认情况下[应用程序中名为'templates'的任何目录都会自动搜索] (https://docs.djangoproject.com/en/1.7/ref/templates/api/#django.template.loaders.app_directories.Loader)。 – 2014-12-08 08:03:07

+0

会不会具体增加搜索时间? – Liondancer 2014-12-08 08:07:01

1

如果你的模板目录是在项目的根,你必须将它添加到setitngs.py

如果它是一个应用程序的子目录(即在settings.py中的INSTALLED_APPS中),那么应用模板加载器(默认启用)将加载它。

如果你的应用程序被称为home,那么你将有模板目录在主目录内,而不是在模板下的home,因为它位于模板目录的home子目录下。 py