Django TemplateDoesNotExist?

Моя локальная машина работает под управлением Python 2.5 и Nginx в Ubuntu 8.10, с Django, созданным на основе последних разработок.

Для каждого URL, который я запрашиваю, он выдает:

TemplateDoesNotExist в /appname/путь appname/template_name.html

Django попытался загрузить эти шаблоны в следующем порядке: * Использование загрузчика django.template.loaders.filesystem.function: * Использование загрузчика django.template.loaders.app_directories.function:

TEMPLATE_DIRS ('/usr/lib/python2.5/site-packages/projectname/templates',)

В этом случае он ищет /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html? Странно то, что этот файл существует на диске. Почему Джанго не может найти это?

Я запускаю то же самое приложение на удаленном сервере с Python 2.6 в Ubuntu 9.04 без такой проблемы. Остальные настройки такие же.

Есть ли что-то неправильно настроенное на моей локальной машине, или что могло вызвать такие ошибки, которые я должен рассмотреть?

В моем settings.py я указал:

SETTINGS_PATH = os.path.normpath(os.path.dirname(__file__))
# Find templates in the same folder as settings.py.
TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

Нужно искать следующие файлы:

  • /usr/lib/python2.5/site-packages/projectname/templates/appname1/template1.html
  • /usr/lib/python2.5/site-packages/projectname/templates/appname1/template2.html
  • /usr/lib/python2.5/site-packages/projectname/templates/appname2/template3.html
  • ...

Все вышеперечисленные файлы существуют на диске.

решаемая

Теперь он работает после того, как я попробовал:

chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

Это странно. Мне не нужно делать это на удаленном сервере, чтобы заставить его работать.

Ответ 1

Первое решение:

Эти настройки

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

означает, что Django будет искать шаблоны из каталога templates/ в вашем проекте.

Предполагая, что ваш проект Django находится в /usr/lib/python2.5/site-packages/projectname/, тогда ваши настройки django будут искать шаблоны под /usr/lib/python2.5/site-packages/projectname/templates/

Итак, в этом случае мы хотим, чтобы наши шаблоны были структурированы следующим образом:

/usr/lib/python2.5/site-packages/projectname/templates/template1.html
/usr/lib/python2.5/site-packages/projectname/templates/template2.html
/usr/lib/python2.5/site-packages/projectname/templates/template3.html

Второе решение:

Если это все еще не работает и предполагается, что у вас есть приложения, настроенные в settings.py, выполните следующие действия:

INSTALLED_APPS = (
    'appname1',
    'appname2',
    'appname3',
)

По умолчанию Django будет загружать шаблоны в каталоге templates/ под каждым установленным приложением. Поэтому с вашей структурой каталогов мы хотим переместить наши шаблоны так:

/usr/lib/python2.5/site-packages/projectname/appname1/templates/template1.html
/usr/lib/python2.5/site-packages/projectname/appname2/templates/template2.html
/usr/lib/python2.5/site-packages/projectname/appname3/templates/template3.html

Надеюсь, что это поможет.

SETTINGS_PATH не может быть задано по умолчанию. В этом случае вы захотите определить его (в settings.py):

import os
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))

Ответ 2

Найдите этот кортеж:

    import os
    SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            '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',
                ],
            },
        },
    ]

Вам нужно добавить в 'DIRS' строку

"os.path.join(SETTINGS_PATH, 'templates')"

Так что вам нужно:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(SETTINGS_PATH, 'templates')],
        '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',
            ],
        },
    },
]

Ответ 3

В настройке .py удалить TEMPLATE_LOADERS и TEMPLATE DIRS Затем ADD

TEMPLATES = [
 {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': ['/home/jay/apijay/templates',],
    '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',
        ],
    },
 },
]

Ответ 4

Если вы столкнулись с этой проблемой, когда вы добавляете app с нуля. Вероятно, потому, что вы пропустите некоторые settings. Три шага необходимы при добавлении app.

1. Создайте каталог и файл шаблона.

Предположим, у вас есть проект с именем mysite и вы хотите добавить app именем your_app_name. Поместите файл шаблона в папку mysite/your_app_name/templates/your_app_name следующим образом.

├── mysite
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── your_app_name
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates
│   │   └── your_app_name
│   │       └── my_index.html
│   ├── urls.py
│   └── views.py

2. Добавьте app в INSTALLED_APPS.

Изменить settings.py

INSTALLED_APPS = [
    ...
    'your_app_name',
    ...
]

3, Добавить app каталог в DIRS в TEMPLATES.

Изменить settings.py.

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]

Ответ 6

Проверьте разрешения на шаблоны и каталоги имен приложений, либо с помощью ls -l, либо попробуйте выполнить полный путь open() из django.

Ответ 7

Теперь он работает после того, как я попробовал

chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

Это странно. Мне не нужно делать это на удаленном сервере, чтобы он работал.

Кроме того, я должен запустить следующую команду на локальном компьютере, чтобы сделать все статические файлы доступными, но на удаленном сервере все они "root: root".

chown -R www-data:www-data /var/www/projectname/*

Локальный компьютер работает на настольной версии Ubuntu 8.04. Удаленный сервер находится на серверной версии Ubuntu 9.04.

Кто-нибудь знает почему?

Ответ 8

У меня была неловкая проблема...

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

Ответ 9

Ошибка Django TemplateDoesNotExist означает, что инфраструктура не может найти файл шаблона.

Чтобы использовать API-интерфейс для загрузки шаблона, вам нужно указать структуру, в которой вы храните свои шаблоны. Место для этого - в файле настроек (settings.py) с помощью параметра TEMPLATE_DIRS. По умолчанию это пустой кортеж, поэтому этот параметр указывает механизм загрузки шаблона Django, где искать шаблоны.

Выберите каталог, в котором вы хотите сохранить свои шаблоны, и добавьте его в TEMPLATE_DIRS, например:

TEMPLATE_DIRS = (
  '/home/django/myproject/templates',
)

Ответ 10

Для версии django 1.9 я добавил

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

в блок шаблонов в settings.py И он хорошо работал

Ответ 11

Убедитесь, что ваш templates.html находится в директории /usr/lib/python2.5/site-packages/projectname/templates.

Ответ 12

Посмотрите, какая папка django попытается загрузить шаблон, посмотрите на Template-loader postmortem на странице с ошибкой, например, ошибка будет такой:

Template-loader postmortem

Django tried loading these templates, in this order:

Using engine django:
django.template.loaders.filesystem.Loader: d:\projects\vcsrc\vcsrc\templates\base.html (Source does not exist)

В моей ошибке vcsrc\vcsrc\templates\base.html не в пути.
Затем измените TEMPLATES в файле setting.py на ваш путь к шаблонам

TEMPLATES = [
    {    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
         # 'DIRS': [], 
        'DIRS': [os.path.join(BASE_DIR, 'vcsrc/templates')], 
        ...

Ответ 13

Привет, ребята, я нашел новое решение. На самом деле это определено в другом шаблоне, поэтому вместо того, чтобы сами определять TEMPLATE_DIRS, укажите путь к вашему каталогу: введите описание изображения здесь

Ответ 14

Я должен использовать шаблоны для внутреннего приложения, и это работает для меня:

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

Ответ 15

Мне стыдно признать это, но проблема для меня заключалась в том, что шаблон был указан как ….hml вместо ….html. Осторожно!

Ответ 16

пример

├── mysite
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── elite_schedule
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates
│   │   └── elite_schedule
│   │       └── index.html
│   ├── urls.py
│   └── views.py

Создайте пути внутри проекта следующим образом в файле settings.py:

BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))

Настройка, где найти шаблоны

Вам нужно указать Django для поиска ваших шаблонов в папке шаблонов. Для этого добавьте dir templates в объект TEMPLATES, отредактировав файл settings.py как показано жирным шрифтом в следующем примере кода:

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

При отображении шаблона в представлении укажите свой шаблон в следующем порядке: 'elite_schedule/index.html'. В этом случае это будет папка шаблонов в приложении, шаблоны приложения elite_schedule находятся по адресу templates/elite_schedule/index.html.

Если вы попытаетесь указать шаблон визуализации как index.html вы получите TemplateDoesNotExist.

def index(request):
    """View function for home page of site."""
    .......
    # Render the HTML template index.html with the data in the context variable
    return render(request, 'elite_schedule/index.html', context=context)

Ответ 17

Я добавил это

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

и это все еще показывало ошибку, тогда я понял, что в другом проекте шаблоны показывались без добавления этого кода в файле settings.py, поэтому я проверил этот проект и понял, что я не создал виртуальную среду в этом проекте, поэтому я сделал

virtualenv env 

и это сработало, не знаю почему

Ответ 18

Я придумал эту проблему. Вот как я решил это:

Посмотрите на ваши settings.py, найдите переменную TEMPLATES, внутри ШАБЛОНОВ добавьте путь к шаблонам в список DIRS. Для меня сначала я установил путь к шаблонам как TEMPLATES_PATH = os.path.join(BASE_DIR,'templates'), затем добавил TEMPLATES_PATH в список DIRS, 'DIRS':[TEMPLATES_PATH,]. Затем перезапустите сервер, исключение TemplateDoesNotExist пропало. Это.

Ответ 19

в вашем setting.py файле замените DIRS в массиве TEMPLATES этим

'DIRS': []

к этому

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

но я думаю, тебе нужно знать, что Вы должны создать папку с именем templates , и она должна быть в корневом пути, иначе вам придется изменить значение DIRS.

Ответ 20

1. Создайте папку "Шаблоны" в вашем "приложении" (скажем, вы назвали так ваше приложение) и вы можете поместить файл HTML здесь. Но настоятельно рекомендуется создать папку с тем же именем ('app') в папке 'templates' и только потом помещать туда htmls. В папку "app/templates/app"

2. Теперь в "app" urls.py вставьте:

  path('', views.index, name='index'), # in case of  use default server index.html 

3. в "app" views.py положить:

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want