Как лучше всего разместить шаблоны в проекте Django? - PullRequest
77 голосов
/ 16 ноября 2009

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

Ответы [ 9 ]

78 голосов
/ 17 ноября 2009

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

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

47 голосов
/ 16 ноября 2009

Из книги Джанго, глава 4 :

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

Это именно то, что я делаю, и отлично сработало для меня.

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

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

9 голосов
/ 30 июля 2012

Вслед за Домиником и Драстом,

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

6 голосов
/ 25 сентября 2017

DJANGO 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

1 голос
/ 30 мая 2016

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

import os

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(os.path.realpath(__file__)),
                 "../APPNAME/templates")
)
1 голос
/ 16 ноября 2009

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

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

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

0 голосов
/ 05 февраля 2017

Джанго 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.

О лучшем месте, Джанго ищет такой шаблон:

  • DIRS определяет список каталогов, в которых движок должен искать исходные файлы шаблона, в порядке поиска.
  • APP_DIRS сообщает, должен ли движок искать шаблоны внутри установленных приложений. Каждый сервер определяет условное имя для подкаталога внутри приложений, где должны храниться его шаблоны.

Дополнительная информация: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration

0 голосов
/ 03 октября 2016

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

TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
0 голосов
/ 16 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...