我最近把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.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates'))
至于模板文件夹应该放在哪里,我不知道,因为Django 1.4刚刚出来,我还没有看过它。你可能应该问另一个关于SE的问题来解决这个问题。
您还可以使用normpath来清理路径,而不是abspath。然而,在这种情况下,Django希望使用绝对路径而不是相对路径。
为了跨平台兼容性,请使用os。Pardir而不是“..”。
from os.path import dirname, realpath, join
join(dirname(realpath(dirname(__file__))), 'templates')
更新:
如果你碰巧通过符号链接“复制”settings.py, @forivall的答案更好:
~user/
project1/
mysite/
settings.py
templates/
wrong.html
project2/
mysite/
settings.py -> ~user/project1/settings.py
templates/
right.html
上面的方法将“看到”wrong.html,而@forivall的方法将看到right.html
在没有符号联系的情况下,这两个答案是相同的。
不是一个回答,而是一个很长很切题的评论,可能有人会被引入歧途。
os.path语法。加入(os.path。Dirname (__file__), 'foo.txt')在运行python文件的同一文件夹中获取一个文件并不是包的“建议”解决方案,相反,出于几个原因,包数据是首选的,例如在zip打包包或更复杂的文件系统中。
pkg_resources。Read_text (__package__, 'foo.txt')是以前推荐的解决方案,但在某些时候将被删除,importlib.resources. txt将被删除。Read_text (__package__, 'foo.txt')是推荐的方法-查看https://docs.python.org/3/library/importlib.html#module-importlib.resources的许多选项。
然而,这
需要include_package_data=True和package_data的Dict[str, List[str]在setup.py文件
需要舱单。在if PIP分发为sdist(但不是一个内置的轮子)
对于相对导入无效(即未安装)
在web应用程序中,由于它们的运行方式而被明智地忽略了吗