TypeError:预期的 str、bytes 或 os.PathLike 对象,而不是 Django 中的元组

我收到一个错误 TypeError: expected str, bytes or os.PathLike object, not tuple 多次尝试从互联网上尝试不同的方法,但没有任何效果。谁能帮我解决这个问题。

这是我在 settings.py 文件中的模板部分:

from pathlib import Path
import os
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
TEMPLATE_DIRS = (os.path.join(BASE_DIR / 'templates'),
                 )
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [TEMPLATE_DIRS,],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
stack overflow TypeError: expected str, bytes or os.PathLike object, not tuple in Django
原文答案

答案:

作者头像

这条线似乎是问题所在

TEMPLATE_DIRS = (os.path.join(BASE_DIR / 'templates'),)

DIRS 正在寻找一个列表,而不是一个元组列表,所以你可以使用

'DIRS': [os.path.join(BASE_DIR, 'templates')],

或者如果你想保持你的方式:

TEMPLATE_DIRS = [os.path.join(BASE_DIR / 'templates'),]

然后将 DIRS 设置为

'DIRS': TEMPLATE_DIRS,
作者头像

将模板目录设置为:

'DIRS': [BASE_DIR / 'templates'],

如果没有运行,设置为 BASE_DIR/ "templates"

作者头像
TEMPLATE_DIRS = (os.path.join(BASE_DIR / 'templates'),

我认为正确的说法是:

TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'templates'),

然后将它放在 TEMPLATES 列表中作为 DIRS 的值

另一种方法是简单地将 (os.path.join(BASE_DIR, 'templates'), 放在 TEMPLATES 列表中

作者头像

TEMPLATE_DIRS = (os.path.join(BASE_DIR / 'templates'), 在你的例子中看起来是错误的 - / 已经做了 .join ,我相信。由于 BASE_DIRPath() ,我会将此行更改为以下内容:

TEMPLATE_DIRS = [BASE_DIR / 'templates']

但是,您确定 TEMPLATE_DIRS 是(或者现在可能是)问题而不是 SETTINGS 中某处的其他路径吗?

我刚刚升级到 Django 4.1,就我而言,更改 MEDIA_ROOT 解决了它。它是一个只有 1 个元素的元组,可能一开始就不应该是一个元组,但它多年来一直没有问题。但是现在我突然也得到了这个错误。