Яке найкраще розташувати шаблони в проекті 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 / ...
Наслідування Домініка та Длруста,
Ми використовуємо дистрибутив джерела 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 знаходиться у вашому 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, який є вашим базовим каталогом. змініть 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
Я зрозумів, що 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')
Django 1.10
TEMPLATE_DIRS
застаріло.
Тепер нам потрібно використовувати TEMPLATE
, представивши в Django 1.8 ось так:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
Визначивши ШАБЛОНИ, ви можете безпечно видалити 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 будь-яким значущим чином, тому не можу за це ручатися.]