Как лучше всего разместить шаблоны в проекте 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") ]
Другие вопросы по тегам