Шаблон Django не найден

У меня проблема с Django, из-за которой только иногда возникают проблемы с поиском шаблонов. Он будет работать нормально в течение нескольких часов, а затем вдруг не сможет обслуживать определенные шаблоны. Иногда проблема решается сама собой, но ее всегда можно исправить, нажав touch <template>. Мое текущее решение - это cronjob, который выполняет touch <project root> каждую минуту, и это работает, пока cron идет в ногу. Тем не менее, я хочу найти правильное решение моей проблемы.

Соответствующие настройки:

PROJECT_ROOT = os.path.dirname(__file__)
APPS_ROOT = os.path.abspath(os.path.join(PROJECT_ROOT, "apps"))

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)
TEMPLATE_DIRS = (
    (PROJECT_ROOT + '/templates'),
)
TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.request",
    "django.core.context_processors.i18n",
    "django.contrib.messages.context_processors.messages",
    "base_site.context_processors.app_list"
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

Ответ 1

Так получается, что моя проблема была не в самом Django, а в моей среде. Я запускал сервер Django из ~/Django-проекта, и наш dev-сервер шифрует домашние каталоги после завершения всех сеансов, что означает, что служба больше не сможет его найти. Перемещение проекта в/var/и демонрование команды manage.py runningerver не позволило проекту избежать ошибок шаблона.

Ответ 2

Просто хотел добавить еще один случай, когда вы можете получить ошибку Template Does Not Exist.

Убедитесь, что вы добавили приложение в переменную INSTALLED_APPS внутри вашего файла settings.py. Недостаточно команды startapp.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myappname', # add your app here :)
]

Я знаю, что это глупо, но я знаю людей, которые потерпели неудачу в своем драйвере, потому что забывают пристегнуть ремень безопасности, поэтому забыть строку кода не так редко, как кажется.

Ответ 3

Попробуйте обновить свои настройки следующим образом:

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

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

(Это стандартный способ получения BASE_DIR в django 1.8). До Python 3.4, __file__ не гарантирует абсолютный путь к файлу.

Вы также должны попробовать и остаться агностиком платформы, используя os.path.join, а не добавлять каталог в виде строки (другие платформы используют обратную косую черту).