【问题标题】:How to set Django template path properly?如何正确设置 Django 模板路径?
【发布时间】:2020-09-11 09:46:27
【问题描述】:

在最新的 django 文档“从项目的模板目录覆盖” https://docs.djangoproject.com/en/3.1/howto/overriding-templates/ 它表明您可以将以下路径用于模板:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        ...
    },
]

我尝试使用[BASE_DIR / 'templates'],但我不断收到以下错误:
TypeError: unsupported operand type(s) for /: 'str' and 'str'

当我将代码更改为:[BASE_DIR , 'templates'][os.path.join(BASE_DIR , 'templates')] 时,一切正常,在这种情况下没问题。
有人可以解释我在[BASE_DIR / 'templates'] 行中缺少什么吗? 谢谢。

我正在使用 Python 3.8 和 Django 3.1。

【问题讨论】:

  • 使用os.path.join() 会很好,但你不应该使用[BASE_DIR , 'templates'] - 即向DIRS 添加两个目录 - 基本目录本身和'templates'(这可能适用于时间作为相对目录)

标签: python django django-templates python-3.8 django-3.1


【解决方案1】:

要使用BASE_DIR / 'templates',您需要将BASE_DIR 设为Path()

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

我怀疑你的 settings.py 是用早期版本的 Django 创建的,因此BASE_DIR 是一个字符串,例如

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

【讨论】:

  • 我的设置是用django 3.0创建的,后来我把django升级到了3.1,但是设置还在。确实它说:BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))),所以这可能是正确的答案。
  • 好吧,我尝试将设置从BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 更改为BASE_DIR = Path(__file__).resolve().parent.parent,现在可以正常工作了。谢谢@Alasdair
  • 顺便说一句:我还包括:from pathlib import Path(对于那些可能遇到这个问题的人)
【解决方案2】:

谢谢

from pathlib import Path 
import os

BASE_DIR = Path(__file__).resolve().parent.parent

【讨论】: