Ошибка типа: ожидаемые str, байты или os.Объект, подобный пути, не является кортежем в Django

#python #django #django-templates

#python #django #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',
            ],
        },
    },
]
  

Ответ №1:

Похоже, проблема в этой строке

 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,
  

Комментарии:

1. Затем я получаю ожидаемые str, байты или os. Объект, подобный пути, а не список

Ответ №2:

Установите каталог шаблонов в:

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

Если он не запускается, установите значение BASE_DIR/ "templates"

Ответ №3:

 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 список

Ответ №4:

TEMPLATE_DIRS = (os.path.join(BASE_DIR / 'templates'), в вашем примере выглядит неправильно — я полагаю, / уже делает .join . Поскольку BASE_DIR это Path() , я бы изменил эту строку на следующую:

 TEMPLATE_DIRS = [BASE_DIR / 'templates']
  

Однако вы уверены, TEMPLATE_DIRS что это (или, может быть, сейчас была) проблема, а не какой-то другой путь где-то в вашем SETTINGS ?

Я только что обновился до Django 4.1, и в моем случае изменение MEDIA_ROOT решило проблему. Это был кортеж всего из 1 элемента, и, вероятно, он никогда не должен был быть кортежем с самого начала, но он работал без проблем в течение многих лет. Но теперь я внезапно получил именно эту ошибку.