2012-11-16 48 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/避免有用模板名稱衝突。