2012-11-16 44 views
0

我正在尝试模板加载和settings.py的最佳做法。建议我见过预日期1.4,所以我已经添加到'..'下面的代码,以弥补1.4的显然更多嵌套的项目结构:在Django中加载模板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模板加载器,所以不必担心绝对路径?

回答

1

这是我有它在settings.py的方式:你可以使用posixpath.join得到/作为路径分隔符

#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')) 
0

,无论在哪个平台上运行代码。见os.path

+0

不知道这是否会工作,因为我认为我的'DIR'变量是以平台特定的方式定义的 –

0

文件关于第一个问题:

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

将在“/../templates”部分取代反斜杠,所以没有,它不一样的。做

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

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

关于你的第二个问题,可能会出现occassions,你只是想重写模板。比方说,您只使用第三方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会使用你的版本而不是原版。毕竟这是一个设计问题:您可以实现自定义应用程序并覆盖模板,但是应用程序应该再次执行某些任务并在'模板'文件夹中填充不相关的模板感觉不正确。

0

我的方式,

设置。潘岳:

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

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/避免有用模板名称冲突。