Как лучше всего разместить шаблоны в проекте django?


89

Как лучше всего разместить шаблоны в проекте django?

Ответы:


50

Из книги Django, глава 4 :

Если вы не можете придумать очевидного места для размещения ваших шаблонов, мы рекомендуем создать каталог шаблонов в вашем проекте Django (то есть в каталоге mysite, который вы создали в главе 2, если вы следовали нашим примерам).

Это именно то, чем я занимаюсь, и мне очень помогло.

Моя структура каталогов выглядит примерно так:

/mediaдля всех моих CSS / JS / изображений и т.д.
/templatesдля моих шаблонов
/projectnameдля основного кода проекта (т.е. кода Python)


1
когда вы помещаете шаблоны в / templates, есть ли способ указать загрузчику шаблонов загрузить его без указания полного пути к / template в TEMPLATE_DIRS для загрузки с помощью django.template.loaders.filesystem.Loader? Было бы здорово сделать это с относительным путем, а под 1.4 мой загрузчик не смотрит в <project> / templates
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

87

Размещен в <PROJECT>/<APP>/templates/<APP>/template.html для шаблонов для конкретных приложений, чтобы помочь сделать приложение пригодным для повторного использования в другом месте.

Для общих "глобальных" шаблонов я помещаю их в <PROJECT>/templates/template.html


11
Хотите знать причину появления 2 <APP>с <PROJECT>/<APP>/templates/<APP>/template.html?
Дэвид Ся

18
Первый / app / templates предназначен просто для группировки шаблонов с их соответствующим приложением. Второе приложение предназначено для предотвращения конфликтов имен. (Предположительно, вы укажете TEMPLATE_DIRS, чтобы указать на каждый из этих каталогов, но в конце Django объединяет их в один гигантский каталог.) См. Docs.djangoproject.com/en/dev/ref/templates/api/…
Ceasar Bautista,

3
Чтобы это сработало (django 1.6), мне пришлось добавить директиву для загрузчика шаблонов файловой системы:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
Fafaman

3
Это древний ответ, но каким-то образом я оказался здесь. Для записи, TEMPLATE_DIRSтеперь осуждается - вместо этого вы должны добавить DIRS=[os.path.join(BASE_DIR, "templates")]к TEMPLATES- см stackoverflow.com/questions/29725132/...
Джон Аарон

9

Вслед за Домиником и 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 без изменений в тестовой, приемочной и производственной средах.


1
+1 Спасибо за дополнительные детали и примеры строк.
gotgenes

+1 умный, чтобы включить его /static/в свой план макета, когда думаете о шаблонах и модульных приложениях. Возможно, вы захотите упомянуть еще один передовой метод, поместив cssфайлы в папку, названную static/app/cssаналогично для jsи, возможно, jpgили просто /static/app/images.
hobs

7

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


1

Это больше личный выбор на уровне проекта. Если вы говорите о приложениях, которые должны быть подключаемыми, то каталог шаблонов в вашем приложении - это место, где они используются по умолчанию. Но в масштабах проекта это то, что вам больше всего подходит.


1

Я понял, TEMPLATE_DIRSтребуется абсолютный путь. И мне не нравятся абсолютные пути в моем коде. Так что это хорошо работает для меня settings.py:

import os

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(os.path.realpath(__file__)),
                 "../APPNAME/templates")
)

1
Базовый путь проектов Django уже определен в стандартном файле settings.py as BASE_DIR, поэтому вы можете упростить его до:os.path.join(BASE_DIR, '../APPNAME/templates')
ngoue

1

Джанго 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/#configuration


0

Предыдущее решение в моем случае не сработало. Я использовал:

TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]

Посмотри мой ответ. TEMPLATE_DIRSустарел.
Вилфрид

Базовый путь проектов Django уже определен в стандартном файле settings.py as BASE_DIR, поэтому вы можете упростить его до:os.path.join(BASE_DIR, '../myapp/templates')
ngoue

0

Вы также можете рассмотреть возможность размещения ваших шаблонов в базе данных, используя django-dbtemplates. . Он также настроен для кеширования и приложения django-reversion, которое помогает вам хранить старые версии ваших шаблонов.

Он работает довольно хорошо, но я бы предпочел немного больше гибкости при импорте / синхронизации в / из файловой системы.

[редактировать: 20 августа 2018 г. - этот репозиторий недоступен, репозиторий с таким же именем доступен по адресу https://github.com/jazzband/django-dbtemplates и был обновлен 8 месяцев назад. Я больше не использую Django каким-либо значимым образом, поэтому не могу за это поручиться.]


Когда это было бы хорошей идеей? Не медленнее ли загружать шаблоны из БД?
jguffey

Разве вы не становитесь зависимыми от db, если храните шаблоны в db, плюс сделаете ли вы свою db частью коммитов git? Как вы будете согласовывать изменения, внесенные разными пользователями в шаблоны?
gautamaggarwal

Это было написано задолго до того, как я узнал о git. Даже не уверен, что в то время я использовал svn. Я бы рекомендовал использовать системы контроля версий сейчас.
TonyM

@tonemcd, этот репозиторий удален.
lmiguelvargasf
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.