在Django 1.4中加载模板

时间:2012-11-16 15:41:30

标签: django django-templates

我正在尝试使用模板加载和settings.py来遵循最佳做法。我在1.4之前看过的建议,因此我在下面的代码中添加了'..'来补偿1.4显然更嵌套的项目结构:

import os
DIR = os.path.abspath(os.path.dirname(__file__))

TEMPLATE_DIRS = (
    # Always use forward slashes, even on Windows.
    os.path.join(DIR, '..', 'templates').replace('\\','/'),
)

它似乎有用,但这是我打算做的吗?

由于你应该一直使用正斜杠,我们不能DIR + '/../templates'.replace('\\','/'), - 而不是调用join()吗?

另一个新手问题是:为什么不只使用app_directories模板加载器,所以不必担心绝对路径?

5 个答案:

答案 0 :(得分:1)

这就是我在settings.py上的方式:

#settings.py
from os.path import dirname, join, realpath
# have in mind that I have settings.py under project_root/project/settings.py
# so you probably want to check your path to your project root folder first
ROOT_DIR = realpath(join(dirname(__file__), '..'))
MEDIA_ROOT = realpath(join(ROOT_DIR, 'media'))

答案 1 :(得分:0)

无论代码在哪个平台上运行,您都可以使用posixpath.join获取/作为路径分隔符。请参阅os.path

的文档

答案 2 :(得分:0)

关于你的第一个问题:

DIR + '/../templates'.replace('\\','/') 

将替换'/../templates'部分中的反斜杠,所以不,它不一样。做

DIR.replace('\\','/') + '/../templates'

确实是一样的,但os.path.join是一种更优雅,更干净的方法。

关于你的第二个问题,可能会有你想要覆盖模板的场合。比如说,例如,您只使用第三方django应用程序,并且您只想覆盖其中一个应用程序中的模板。由于django按照TEMPLATE_LOADERS设置指令(https://docs.djangoproject.com/en/dev/ref/templates/api/#loader-types)的顺序搜索模板,因此可以按如下方式设置TEMPLATE_LOADERS:

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

和你的TEMPLATE_DIRS完全一样:

TEMPLATE_DIRS = (
    os.path.join(DIR, '..', 'mytemplates').replace('\\','/'),
)

然后,如果您将模板放在'mytemplates'目录中,它将在找到等效的app_directories模板之前进行匹配(请记住文件系统加载程序在app_directories加载器之前)。因此django将使用您的版本而不是原始版本。

毕竟这是一个设计问题:您可以实现自定义应用程序并覆盖模板,但应用程序应该再次执行某些任务,并且在“模板”文件夹中填充不相关的模板感觉不对。

答案 3 :(得分:0)

我拥有它的方式,

settings.py:

import os.path
static = os.path.join(os.path.dirname(__file__), 'static')
media = os.path.join(os.path.dirname(__file__), 'media')
template= os.path.join(os.path.dirname(__file__), 'template')

TEMPLATE_DIRS = (
    template,
)
# rest is the same

然后在myproject.myproject

中创建一个名为“静态”,“媒体”,“模板”的文件夹

答案 4 :(得分:0)

我认为组织项目的更好方法是遵循LINK1LINK2,而不是遵循Django 1.4中的默认目录结构。当您有许多应用程序(包括第三方应用程序)时,Django结构不直观。

根据链接中的结构,我正在进行以下模板加载:

#settings.py
from os.path import abspath, dirname, join

PROJ_ROOT = dirname(abspath(__file__))
APPS_ROOT = join(PROJ_ROOT, 'apps')

sys.path.append(join(PROJ_ROOT,'apps'))

TEMPLATE_DIRS = (
    join(APPS_ROOT, 'templates'),
    join(PROJ_ROOT, 'templates'),
)

此外,将特定于应用程序的模板放在../app_name/templates/app_name/中以避免模板名称冲突会很有用。