За конфигурацию шаблонов в проекте отвечает переменная TEMPLATES в файле settings.py. По умолчанию она имеет следующее содержимое:
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', ], }, }, ]
Данная переменная принимает список конфигураций для каждого движка шаблонов. По умолчанию определена одна конфигурация, которая имеет следующшие параметры
BACKEND: движок шаблонов. По умолчанию применяется встроенный движок django.template.backends.django.DjangoTemplates
DIRS: определяет список каталогов, где движок шаблонов будет искать файлы шаблонов. По умолчанию пустой список
APP_DIRS: указывает, будет ли движок шаблонов искать шаблоны внутри папок приложений в папке templates.
OPTIONS: определяет дополнительный список параметров. В частности, указывает, какие обработчики (процессоры) будут использоваться при обработке шаблонов.
По умолчанию параметр APP_DIRS имеет значение True, а это значит, что движок шаблонов будет также искать нужные файлы шаблонов в папке приложения в каталоге templates. Это довольно удобно, если для каждого приложения предназначены какие-то свои шаблоны. Это также позволяет избежать проблем с наименованиями.
Тем не менее иногда возникает необходимость размещения шаблонов где-то в другом месте. Например, у нас есть общие шаблоны для всего проекта - для всех приложений, и было бы логично разместить их в каком-то одном общем месте, например, в папке проекта. К примеру, определим в каталоге проекта папку templates (название папки может быть любым). И в этой папке определим файл index.html с каким-нибудь простейшим кодом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Django on METANIT.COM</title> </head> <body> <h1>Hello METANIT.COM!</h1> </body> </html>
В моем случае проект называется metanit, который располагается в одноименной папке. В проекте находится папка templates с одним шаблоном. Но чтобы этот шаблон задействовать, надо настроить пути к этой папке в файле setting.py. Так, изменим переменную TEMPLATES:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [ BASE_DIR / "metanit/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', ], }, }, ]
В данном случае в список папок DIRS добавляется один путь - BASE_DIR / "metanit/templates"
. Для образования пути берется определенная в
начале файла settings.py переменная BASE_DIR:
BASE_DIR = Path(__file__).resolve().parent.parent
которая представляет путь к каталогу, в котором располгается папка проекта. И к этому пути добавляется папка проекта (metanit) и каталог templates.
Пусть в views.py определена функция, которая использует шаблон index.html:
from django.shortcuts import render def index(request): return render(request, "index.html")
И в файле urls.py определен маршрут для этой функции:
from django.urls import path from hello import views urlpatterns = [ path("", views.index), ]
Соответственно при обращении к функции index мы увидим в браузере содержимое файла index.html:
Подобным образом мы можем указать в качестве хранилища шаблонов любой каталог внутри проекта или приложения или даже набор каталогов.