Яке найкраще розташувати шаблони в проекті django?


88

Яке найкраще розташувати шаблони в проекті django?

Відповіді:


50

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

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

Це саме те, що я роблю, і у мене чудово спрацювало.

Моя структура каталогів виглядає приблизно так:

/mediaдля всіх моїх CSS / JS / зображень тощо
/templatesдля моїх шаблонів
/projectnameдля основного коду проекту (тобто коду Python)


1
коли ви розміщуєте шаблони в / templates, чи є спосіб сказати завантажувачу шаблонів завантажити його, не вказавши повний шлях до / шаблону в 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

Наслідування Домініка та Длруста,

Ми використовуємо дистрибутив джерела 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 без змін у середовищі тестування, прийняття та виробництва.


1
+1 Дякуємо, що надали додаткові деталі та приклади рядків.
gotgenes

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

7

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

Це більше особистий вибір на рівні проекту. Якщо ви говорите про додатки, які потрібно підключати, тоді каталог шаблонів у вашому додатку - це місце, де вони переходять за замовчуванням. Але для всього проекту саме це найкраще підходить саме вам.


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 як BASE_DIR, тому ви можете спростити це до:os.path.join(BASE_DIR, '../APPNAME/templates')
ngoue

1

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 шукає такий шаблон:

  • 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 як 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 plus, чи зробите ви db частиною git-комітів? Як ви будете координувати зміни, внесені різними користувачами в шаблони?
gautamaggarwal

Це було написано ще до того, як я дізнався про git. Навіть не впевнений, що на той час я користувався svn. Я б рекомендував зараз використовувати системи контролю версій.
TonyM

@tonemcd, це сховище видалено.
lmiguelvargasf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.