【问题标题】:Django templates relative pathDjango 模板相对路径
【发布时间】:2014-05-12 07:35:58
【问题描述】:
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 到底是什么,所以我在 Django shell 上运行它,

>>> import os.path
>>> os.path.dirname(__file__)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name '__file__' is not defined

为什么这种合法属性在shell中失败了?我确实在 shell 中做了一些测试,并提出了另一个问题:

>>> 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'

带注释的代码os.path.join(BASE_DIR,'templates'),不就是'/templates'出来的吗? 不是根目录吗?如果是这样,Django 如何在我没有的目录中搜索我的模板文件?

【问题讨论】:

    标签: python django templates


    【解决方案1】:

    变量 __file__ 在 Python shell 中不存在。所以你不能只测试这样的值。

    BASE_DIR 值将等于该行所在文件的父文件夹。如果你有一个 Django 项目并且该行在/home/xyz/foo/foo/settings.py 中,那么BASE_DIR 等于/home/xyz/foo

    为什么? __file__ 返回当前文件的绝对路径,这里是我们的settings.py。之后,您将获得两倍的文件夹。第一次将采用/home/xyz/foo/foo/(它删除路径中的文件名),第二次将采用parent文件夹。因此,我们到达了项目主文件夹。

    此外,您无需将 \\ 替换为 /,因为 Python os.path 模块知道如何根据您当前的操作系统处理此问题。

    总而言之,您的当前行指向 Django 项目根目录下的 templates/ 目录:)

    【讨论】:

    • 我只想测试两种方式来创建 TEMPLATE_DIRS 。 “os.path.join(os.path.dirname(file), 'templates')”好像不行,为什么?
    • 你注意到我在那里测试的实验了吗?
      >>> os.path.dirname(os.path.dirname('/user/name')) '/'
      在我占用两倍的文件夹后,它只给了我一个斜线。那么如果我在 /home/xyz/foo/foo/settings.py 中有 django 项目,BASE_DIR 怎么能等于 /home/xyz/foo?我的意思是 BASE_DIR 将是“/”,我说得对吗?
    • 它只在os.path.dirname 上不起作用,因为它会在不存在的/home/xyz/foo/foo/templates 中搜索。在致电 os.path.join 之前,您忘记了一个 dirname。我在您使用dirname 的测试中没有看到任何问题:每次调用它都会从路径中删除一个文件夹。
    • 哦,我明白了,我弄混了一些东西。谢谢
    • 没问题。如果对你有帮助,别忘了accept an answer :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多