我最近把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?


当前回答

使用os。我们可以向上走一个目录

one_directory_up_path = os.path.dirname('.')

同样,在找到您想要的目录后,您可以与其他文件/目录路径连接

other_image_path = os.path.join(one_directory_up_path, 'other.jpg')

其他回答

这在其他情况下很有用当你想往上移动x个文件夹时。只需要运行walk_up_folder(path, 6)就可以找到6个文件夹。

def walk_up_folder(path, depth=1):
    _cur_depth = 1        
    while _cur_depth < depth:
        path = os.path.dirname(path)
        _cur_depth += 1
    return path   

从当前文件路径你可以使用:

os.path.join(os.path.dirname(__file__),'..','img','banner.png')

我很惊讶,在路径字符串中处理任意数量的“..”父目录令牌没有直接由os库处理。这里有一个快速而肮脏的函数,它会给你一个相对路径字符串的绝对路径字符串:

def get_abs_from_relpath(relpath:str) -> str:
    ap = os.path.abspath(__file__).split("/")[:-1]
    sp = relpath.split("/")
    sp_start_index = 0
    for slug in sp:
        if slug == "..":
            ap.pop(-1)
            sp_start_index += 1
        else:
            return "/".join(ap+sp[sp_start_index:])

你可以像这样用open()调用它:

with open(get_abs_from_relpath('../../../somedir/myfile.txt')) as f:
    foo = f.read()
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates'))

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

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

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

如果你更喜欢用一行程序来获取父目录,我建议这样做:

import os
    
parent_dir = os.path.split(os.getcwd())[0]

Os.path.split()方法返回一个元组(head, tail),其中tail是最后一个斜杠之后的所有内容。第一个索引是绝对路径的父节点。