Как лучше всего разместить шаблоны в проекте django?
89
Из книги 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 ... }, }, ]
О лучшем месте, 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 каким-либо значимым образом, поэтому не могу за это поручиться.]
источник