Как лучше всего разместить шаблоны в проекте django?
Ответы:
Из книги Django, глава 4 :
Если вы не можете придумать очевидного места для размещения ваших шаблонов, мы рекомендуем создать каталог шаблонов в вашем проекте Django (то есть в каталоге mysite, который вы создали в главе 2, если вы следовали нашим примерам).
Это именно то, чем я занимаюсь, и мне очень помогло.
Моя структура каталогов выглядит примерно так:
/media
для всех моих CSS / JS / изображений и т.д.
/templates
для моих шаблонов
/projectname
для основного кода проекта (т.е. кода Python)
Размещен в <PROJECT>/<APP>/templates/<APP>/template.html
для шаблонов для конкретных приложений, чтобы помочь сделать приложение пригодным для повторного использования в другом месте.
Для общих "глобальных" шаблонов я помещаю их в <PROJECT>/templates/template.html
<APP>
с <PROJECT>/<APP>/templates/<APP>/template.html
?
TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
TEMPLATE_DIRS
теперь осуждается - вместо этого вы должны добавить DIRS=[os.path.join(BASE_DIR, "templates")]
к TEMPLATES
- см stackoverflow.com/questions/29725132/...
Вслед за Домиником и dlrust,
Мы используем исходный дистрибутив 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#the-manifest-in-template )
Пример 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 без изменений в тестовой, приемочной и производственной средах.
/static/
в свой план макета, когда думаете о шаблонах и модульных приложениях. Возможно, вы захотите упомянуть еще один передовой метод, поместив css
файлы в папку, названную static/app/css
аналогично для js
и, возможно, jpg
или просто /static/app/images
.
DJANGO 1.11
добавьте папку шаблонов, в которой существует manage.py, который является вашим базовым каталогом. измените КАТАЛОГИ для ШАБЛОНОВ, как показано в файле 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
Это больше личный выбор на уровне проекта. Если вы говорите о приложениях, которые должны быть подключаемыми, то каталог шаблонов в вашем приложении - это место, где они используются по умолчанию. Но в масштабах проекта это то, что вам больше всего подходит.
Я понял, TEMPLATE_DIRS
требуется абсолютный путь. И мне не нравятся абсолютные пути в моем коде. Так что это хорошо работает для меня settings.py
:
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(os.path.realpath(__file__)),
"../APPNAME/templates")
)
BASE_DIR
, поэтому вы можете упростить его до:os.path.join(BASE_DIR, '../APPNAME/templates')
Джанго 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 ищет такой шаблон:
Дополнительная информация: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration
Предыдущее решение в моем случае не сработало. Я использовал:
TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
TEMPLATE_DIRS
устарел.
BASE_DIR
, поэтому вы можете упростить его до:os.path.join(BASE_DIR, '../myapp/templates')
Вы также можете рассмотреть возможность размещения ваших шаблонов в базе данных, используя django-dbtemplates. . Он также настроен для кеширования и приложения django-reversion, которое помогает вам хранить старые версии ваших шаблонов.
Он работает довольно хорошо, но я бы предпочел немного больше гибкости при импорте / синхронизации в / из файловой системы.
[редактировать: 20 августа 2018 г. - этот репозиторий недоступен, репозиторий с таким же именем доступен по адресу https://github.com/jazzband/django-dbtemplates и был обновлен 8 месяцев назад. Я больше не использую Django каким-либо значимым образом, поэтому не могу за это поручиться.]