Как лучше всего разместить шаблоны в проекте Django?
Как лучше всего разместить шаблоны в проекте Django?
10 ответов
Из книги Джанго, глава 4:
Если вы не можете придумать очевидное место для размещения ваших шаблонов, мы рекомендуем создать каталог шаблонов в вашем проекте Django (т. Е. В каталоге mysite, который вы создали в главе 2, если вы следовали вместе с нашими примерами).
Это именно то, что я делаю, и отлично сработало для меня.
Моя структура каталогов выглядит примерно так:
/media
для всех моих CSS/JS/ изображений и т. д./templates
для моих шаблонов/projectname
для основного кода проекта (т.е. кода Python)
Помещено в <PROJECT>/<APP>/templates/<APP>/template.html
для специфичных для приложения шаблонов, чтобы помочь сделать приложение повторно используемым в другом месте.
Для общих "глобальных" шаблонов я помещаю их в <PROJECT>/templates/template.html
ДЖАНГО 1.11
добавьте папку шаблонов, где существует файл manage.py, который является вашим базовым каталогом. измените DIRS для ШАБЛОНОВ следующим образом в вашем settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, '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',
],
},
},
]
Теперь, чтобы использовать шаблон с помощью кода,
def home(request):
return render(request,"index.html",{})
в views.py. это прекрасно работает для Django 1.11
Вслед за Домиником и Друстом,
Мы используем исходный дистрибутив setuptools (sdist) для упаковки нашего проекта django и приложений для развертывания в различных средах.
Мы обнаружили, что шаблоны и статические файлы должны находиться в каталогах приложений django, чтобы их можно было упаковать в setuptools.
Например, наш шаблон и статические пути выглядят так:
PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js
Чтобы это работало, необходимо изменить файл MANIFEST.in (см. http://docs.python.org/distutils/sourcedist.html).
Пример файла MANIFEST.in:
include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg
Кроме того, вам необходимо подтвердить в файле настроек django, что загрузчик app_directories находится в вашем TEMPLATE_LOADERS. Я думаю, что это по умолчанию в Django 1.4.
Пример загрузчиков шаблонов настроек django:
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
На тот случай, если вам интересно, почему мы используем sdists вместо простого копирования файлов rsync; это часть нашего рабочего процесса управления конфигурацией, где у нас есть один сборочный архив, который развертывается с неизменным PIP в тестовой, приемочной и производственной средах.
Джанго 1.10
TEMPLATE_DIRS
устарела.
Теперь нам нужно использовать TEMPLATE
, вводя в Django 1.8, как это:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
Определив TEMPLATES, вы можете безопасно удалить ALLOWED_INCLUDE_ROOTS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_DIRS, TEMPLATE_LOADERS и TEMPLATE_STRING_IF_INVALID.
О лучшем месте, Django ищет такой шаблон:
- DIRS определяет список каталогов, в которых движок должен искать исходные файлы шаблонов, в порядке поиска.
- APP_DIRS сообщает, должен ли движок искать шаблоны внутри установленных приложений. Каждый сервер определяет стандартное имя для подкаталога внутри приложений, где должны храниться его шаблоны.
Дополнительная информация: https://docs.djangoproject.com/en/1.10/topics/templates/
Я понял TEMPLATE_DIRS
требует абсолютного пути. И мне не нравятся абсолютные пути в моем коде. Так что это хорошо работает для меня, в settings.py
:
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(os.path.realpath(__file__)),
"../APPNAME/templates")
)
Это больше личный выбор на уровне проекта. Если вы говорите о приложениях, которые должны быть подключаемыми, то каталог шаблонов в вашем приложении - это то место, куда они идут по умолчанию. Но для всего проекта это то, что работает лучше для вас.
папка чуть ниже — лучшее место, как показано ниже, потому что нам легче управлять шаблонами в одном месте, чем папка сразу под папкой каждого приложения. Вы можете увидеть мой ответ, подробно объясняющий, как установить папку:
django-project
|-core
│ |-settings.py
│ └-urls.py
|-app1
| |-urls.py
| └-views.py
|-app2
| |-urls.py
| └-views.py
└-templates # Here
|-app1
| └-a1.html
└-app2
└-a2.html
Тогда, чтобыtemplates
папка прямо подdjango-project
можно найти, нужно установитьBASE_DIR / 'templates'
в «DIRS» в ШАБЛОНАХ вsettings.py
как показано ниже:
# "settings.py"
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [
BASE_DIR / 'templates', # Here
],
"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",
],
},
},
]
Вы также можете рассмотреть возможность размещения ваших шаблонов в базе данных, используя django-dbtemplates. Он также настроен для кэширования и приложения django-reversion, которое поможет вам сохранить старые версии ваших шаблонов.
Это работает довольно хорошо, но я бы предпочел немного больше гибкости при импорте / синхронизации в / из файловой системы.
[править: 20 августа 2018 года - этот репозиторий недоступен, один с таким же именем доступен по адресу https://github.com/jazzband/django-dbtemplates и обновлен 8 месяцев назад. Я больше не использую Django осмысленно, поэтому не могу ручаться за это.]
Предыдущее решение не сработало в моем случае. Я использовал:
TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]