Django无法找到模板

时间:2012-09-17 01:19:51

标签: django django-templates django-settings

所以我一直在尝试设置一个django设置模块,它将检查环境变量和加载设置。

看看我的设置模块是什么样的

/templates
    home.html

/settings
    base.py
    prod.py
    dev.py
    test.py

base.py

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))

TEMPLATE_DIRS = [
os.path.join(PROJECT_ROOT, "templates"),
]

urls.py

from django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
url(r"^$", direct_to_template, {'template' : 'home.html' }, name="home"),
)

当我将所有设置放在一个文件中时,这工作得很好,但是因为我将文件分开,所以我得到了错误:

TemplateDoesNotExist at /

home.html

Template-loader postmortem

Django tried loading these templates, in this order:
Using loader django.template.loaders.filesystem.Loader:
/Users/Tulsa/Apps/tulsa-applications-co/tulsa/tulsa/settings/templates/home.html (File does not exist)
Using loader django.template.loaders.app_directories.Loader:
/Users/Tulsa/.Apps/tulsa_io/lib/python2.7/site-packages/django/contrib/auth/templates/home.html (File does not exist)
/Users/Tulsa/.Apps/tulsa_io/lib/python2.7/site-packages/django/contrib/admindocs/templates/home.html (File does not exist)
/Users/Tulsa/.Apps/tulsa_io/lib/python2.7/site-packages/grappelli/templates/home.html (File does not exist)
/Users/Tulsa/.Apps/tulsa_io/lib/python2.7/site-packages/django/contrib/admin/templates/home.html (File does not exist)
/Users/Tulsa/.Apps/tulsa_io/lib/python2.7/site-packages/pagination/templates/home.html (File does not exist)
/Users/Tulsa/.Apps/tulsa_io/lib/python2.7/site-packages/djangosaml2/templates/home.html (File does not exist)
/Users/Tulsa/Apps/tulsa-applications-co/tulsa/tulsa/apps/profiles/templates/home.html (File does not exist)
/Users/Tulsa/.Apps/tulsa_io/lib/python2.7/site-packages/debug_toolbar/templates/home.html (File does not exist)

Using loader django.template.loaders.eggs.Loader:

我在这里缺少什么?

5 个答案:

答案 0 :(得分:7)

上述所有答案都需要配置TEMPLATE_DIRS或TEMPLATE_LOADERS,这是不必要和正确的。您只需将您的应用程序放入INSTALLED_APPS。

例如,如果您的应用程序位于MyMegaApp(settigs.py所在的位置),换句话说,您的项目结构如下所示

MyMegaApp
   MyMegaApp
      templates
         index.html
      settings.py 
   manage.py

然后你必须像这样添加你的应用

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'MyMegaApp'
)

之后, index.html 模板将在 MyMegaApp / templates 文件夹中找到

答案 1 :(得分:3)

此处的问题是,在您的设置中,PROJECT_ROOT会评估运行manage.py的目录。

您可以对TEMPLATE_DIRS设置

执行此操作
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
print PROJECT_ROOT    

现在,将../../相对于PROJECT_ROOT追加。像这样:

PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../'))

TEMPLATE_DIRS = [
    os.path.join(PROJECT_ROOT, "templates"),
]

答案 2 :(得分:2)

将您的PROJECT_ROOT更改为:

PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

并确保您的TEMPLATE_LOADERS变量设置正确。

<强>解释

abspath为您提供base.py的完整路径,即/home/some-path/project-folder/settings/base.py

因此,首先dirname为您提供给定路径的dir路径名称(上面获得),即/home/some-path/project-folder/settings/

然后,第二个dirname为您提供给定路径的dir路径名称(上面获得),即/home/some-path/project-folder/

所以,现在当你加入这条路径templates时,一切都开始正常。

有关详情,请参阅python docs

答案 3 :(得分:0)

你可以测试如下吗?

我认为您的代码会将PROJECT_ROOT设置为'/ some / path / to / settings'

from os.path import dirname, abspath, normpath, join
PROJECT_ROOT = dirname(dirname(abspath(__file__)))
TEMPLATE_DIRS = (
normpath(join(PROJECT_ROOT, 'templates')),
)

答案 4 :(得分:0)

在设置中包含此内容

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    os.path.join(SITE_ROOT, 'appname/templates'),

)

将此添加到urls.py

from django.conf.urls.defaults import *
from  django.views.generic.simple.direct_to_template import direct_to_template
from appname.views import *

通过

调用网址
  urlpatterns = patterns('django.views.generic.simple',
    (r'^foo/$',             'direct_to_template', {'template': 'foo_index.html'}),
    (r'^foo/(?P<id>\d+)/$', 'direct_to_template', {'template': 'foo_detail.html'}),
  )
相关问题