0

我正在尝试遵循模板加载和 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('\\','/'),- 而不是调用 tojoin()吗?

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

4

5 回答 5

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'))
于 2012-11-16T16:00:13.720 回答
0

关于你的第一个问题:

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

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

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

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

关于您的第二个问题,有时您可能只想覆盖模板。比如说,您只使用 3rd-party 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 将使用您的版本而不是原始版本。

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

于 2012-11-17T02:27:28.033 回答
0

无论代码在哪个平台上运行,您都可以使用posixpath.joinget作为路径分隔符。/参见文档os.path

于 2012-11-16T16:03:11.463 回答
0

我认为组织项目的更好方法是遵循LINK1LINK2而不是遵循 Django 1.4 中的默认目录结构。当您有许多应用程序(包括 3rd 方应用程序)时,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/ 中会很有用,以避免模板名称冲突。

于 2012-11-17T09:20:44.017 回答
0

我拥有它的方式,

设置.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

于 2012-11-17T03:13:02.500 回答