我最近把Django从v1.3.1升级到了v1.4。

在我的旧设置。py我有

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname( __file__ ), 'templates').replace('\\', '/'),
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

这将指向/Users/hobbes3/Sites/mysite/templates,但因为Django v1.4将项目文件夹移动到与应用文件夹相同的级别,我的settings.py文件现在在/Users/hobbes3/Sites/mysite/而不是/Users/hobbes3/Sites/mysite/。

所以实际上我的问题是双重的

如何使用操作系统。查看__file__上一级目录的路径。换句话说,我想要/Users/hobbes3/Sites/mysite/ settings.py使用相对路径找到/Users/hobbes3/Sites/mysite/templates。 我应该保持模板文件夹(其中有跨应用模板,如管理,注册等)在项目/User/hobbes3/Sites/mysite级别或在/User/hobbes3/Sites/mysite/mysite?


当前回答

你想要的就是:

BASE_DIR = os.path.join( os.path.dirname( __file__ ), '..' )

其他回答

当然:只需使用os.chdir(..)。

你想要的就是:

BASE_DIR = os.path.join( os.path.dirname( __file__ ), '..' )

要获取一个文件的文件夹,只需使用:

os.path.dirname(path) 

要创建文件夹,再次使用os.path.dirname即可

os.path.dirname(os.path.dirname(path))

你可能想检查__file__是否是一个符号链接:

if os.path.islink(__file__): path = os.readlink (__file__)
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates'))

至于模板文件夹应该放在哪里,我不知道,因为Django 1.4刚刚出来,我还没有看过它。你可能应该问另一个关于SE的问题来解决这个问题。

您还可以使用normpath来清理路径,而不是abspath。然而,在这种情况下,Django希望使用绝对路径而不是相对路径。

为了跨平台兼容性,请使用os。Pardir而不是“..”。

对我这样的偏执狂来说,我更喜欢这个

TEMPLATE_DIRS = (
    __file__.rsplit('/', 2)[0] + '/templates',
)