장고

2014-05-12 2 views
0
import os.path 

BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'), 
    #os.path.join(BASE_DIR,'templates'), 
) 

내가 TEMPLATE_DIRS이 정확히 무엇인지 알고 싶은 상대 경로를 템플릿, 그래서 내가 장고 쉘에서 실행? 나는 쉘에서 몇 가지 테스트를했고, 또 다른 질문을했다 : 주석, os.path.join(BASE_DIR,'templates')장고

>>> os.path.dirname(os.path.dirname('/user/name')) 
'/' 
>>> os.path.dirname('/user/name') 
'/user' 
>>> B = os.path.dirname(os.path.dirname('/user/name')) 
>>> os.path.join(B,'template') 
'/template' 

코드, 그것은 '/templates' 함께 제공하지 않습니다? 루트 디렉토리가 아닙니까? 그렇다면 장고는 내가 가지고 있지 않은 디렉토리에서 내 템플릿 파일을 어떻게 검색 할 수 있습니까?

답변

3

변수 __file__은 파이썬 쉘에 존재하지 않습니다. 따라서 여러분은 그러한 가치를 테스트 할 수 없습니다.

BASE_DIR 값은 줄이있는 파일의 상위 폴더와 같습니다. Django 프로젝트가 있고 라인이 /home/xyz/foo/foo/settings.py 인 경우 BASE_DIR/home/xyz/foo과 같습니다.

왜?__file__은 현재 파일의 절대 경로 (여기서는 settings.py)를 반환합니다. 그 후, 폴더를 두 번 가져 가고 있습니다. 처음에는 /home/xyz/foo/foo/ (경로에서 파일 이름이 제거됨)이 걸리고 두 번째로는 부모 폴더가됩니다. 따라서 프로젝트 메인 폴더에 도착합니다.

또한 \\/으로 바꿀 필요가 없습니다. 이는 Python os.path 모듈이 현재 OS에 따라이를 처리하는 방법을 알고 있기 때문입니다. 요약

, 당신의 장고 프로젝트 :

+0

의 루트에서 templates/ 디렉토리로 현재 라인의 포인트는 그냥 TEMPLATE_DIRS을 만들 수있는 두 방법을 테스트하려는. "os.path.join (os.path.dirname (__ file__), 'templates')"이 작동하지 않는 이유는 무엇입니까? – MMMMMCCLXXVII

+0

시험 한 실험을 보았습니까?
>>> os.path.dirname (os.path.dirname ('/ user/name')) '/'
2 번 폴더를 가져간 후 슬래시가 표시됩니다. 그렇다면 BASE_DIR은 /home/xyz/foo/foo/settings.py에 장고 프로젝트가 있다면/home/xyz/foo와 어떻게 같을까요? 내 말은 BASE_DIR은 '/'일 것이다. 나는 그 지점에 있는가? – MMMMMCCLXXVII

+0

존재하지 않는'/ home/xyz/foo/foo/templates'에서 검색하기 때문에'os.path.dirname'에서만이 작업을 수행 할 수 없습니다. 'os.path.join'을 호출하기 전에 하나의'dirname'을 잊어 버렸습니다. 'dirname' 테스트에서 어떤 문제도 보이지 않습니다. 각 호출에서 하나의 폴더를 경로에서 제거합니다. –