如何修复模板加载器以检查根目录?

时间:2014-01-14 03:41:31

标签: python django django-templates satchmo

如果重要的话,我有这样的目录结构(根据satchmo文档,这是默认的推荐结构):

site
- apps
   | - __init__.py
- config
- projects
   | - site
        | - home
             | - templates
                  | - about.html
                  | - home.html
             | - models.py, views.py, admin.py
        | - __init__.py
        | - local_settings.py
        | - settings.py
        | - urls.py
        | - wsgi.py
   | - __init__.py
- static
   | - css
   | - images (maybe this got autogenerated?)
   | - js
   | - media
- templates
   | base.html
- manage.py

我的网址包含about.html和home.html的条目,两者都扩展了base.html。但是,当我访问这些URL时,我会获得一般的satchmo页面,其中包含我从about和home中包含的一些文本,但它根本没有扩展base.html。在我安装satchmo之前,我可以确认这是有效的,但现在我不确定出了什么问题。我假设它正在扩展其他一些base.html,因为如果我将我的extend更改为master.html,它会抛出TemplateDoesNotExist异常(我也不确定如何解决)。我在settings.py中有以下内容:

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

TEMPLATE_DIRS = (
    'templates',
)

如果我将模板目录移动到项目中的站点文件夹,它似乎可以工作,但我不希望它在那里。我尝试将'../../templates'添加到TEMPLATE_DIRS,但这也不起作用,即使它确实如此,我也不确定这将如何与我在app文件夹的某些级别下声明的模板进行交互。解决这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

TEMPLATE_DIRS条目应该是绝对路径。你可以这样做:

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

如果您的master.html在您的模板目录中,那么该错误也应该修复。

BASE_DIR的'基础'是dirname(__file__),它返回包含当前文件settings.py目录。然后,结果是join'..'两次,也就是说,我们进入两个目录,所以现在我们位于顶部的“site”目录中。我们调用abspath来确保它是一个绝对路径,并normpath删除双斜杠等。