我正在尝试使用模板加载和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
模板加载器,所以不必担心绝对路径?
答案 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)
我认为组织项目的更好方法是遵循LINK1或LINK2,而不是遵循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/中以避免模板名称冲突会很有用。