Как грамотно организовать проект на Django (приложения, шаблоны, статические файлы)?

Здравствуйте.

Изучение Django закрепляю разработкой проекта, который в итоговом варианте может быть достаточно большим.
Но уже на начальных шагах стал возникать вопрос организации файлов в проекте. Задумался, как бы делать проект таким, чтобы в случае перерыва легко можно было вспомнить, какой структуры я придерживался и суметь разобраться в нем (или разработчику, который, возможно, будет привлечен к разработке проекта.

Например, на текущий момент я подозреваю, что наверное не очень правильно делать отдельное приложение для каждого раздела сайта:

- приложение, которое содержит общие для всех файлы (базовый шаблон, css-стили, логотип и др).
- приложение, которое обслуживает только один раздел сайта (поиск определенных объектов)
- приложение для функционала добавления этих самых объектов на сайт
- приложение для отображения главной страницы

Решил спросить совета у других разработчиков.
Может кто-то уже разработал удобный принцип и поделится им.

Вопрос №1: По какому принципу лучше создавать приложения? Чтобы одно приложение охватывало целый раздел (например, есть функционал и наполнения сайта и поиска по сайту) или одно приложение для наполнения, а другое для поиска объектов?
Вопрос №2: Где храните общие файлы (базовый шаблон, css-стили, логотип)?
Вопрос №3: Как организовываете шаблоны? (Базовый, включаемые и расширяемые шаблоны)

P.S. Нашел неплохую статью по организации шаблонов. Правда, это внутри одного приложения. Сам стал применять этот принцип. Вроде удобнее.
  • Вопрос задан
  • 13792 просмотра
Пригласить эксперта
Ответы на вопрос 3
zymanch
@zymanch
python/django web-developer
Обычно разделяю предметные области проекта на отдельные приложения. Если какая-то область слишком обширна, то в папке приложения создаю отдельные приложения для подобластей. Для каждого приложения - своя папка templates: это позволяет при большом количестве приложений не путаться в разросшейся иерархии директорий. Кроме того, отправляю всю обособленную статику в директории static каждого приложения: иногда для работы интерфейса пишу JavaScript приложения на Marionette - всегда знаю, где искать нужную кучу скриптов.
Для примера: пишем проект для дилерской сети по распространению и продаже автомобилей. Получается так:
./project_name/
./project_name/settings.py
./project_name/urls.py
./project_name/static/
./project_name/static/css/...
./project_name/static/js/...
./project_name/static/imgs/...
./dealer/
./dealer/admin.py
./dealer/models.py
./dealer/views.py
./dealer/urls.py
./dealer/templates/
./dealer/templates/dealer/
./dealer/templates/dealer/list.html
./vehicles/
./vehicles/admin.py
./vehicles/models.py
./vehicles/logistics/
./vehicles/logistics/models.py
./vehicles/logistics/admin.py
./vehicles/logistics/views.py
./vehicles/logistics/urls.py
./vehicles/logistics/templates/
./vehicles/logistics/templates/logistics/tracking.html
./vehicles/logistics/static/
./vehicles/logistics/static/js/app/tracking/
./vehicles/logistics/static/js/app/tracking/main.js
./vehicles/logistics/static/js/app/tracking/app.js
./vehicles/logistics/static/js/app/tracking/...
./vehicles/sales/
./vehicles/sales/models.py
./vehicles/sales/admin.py
./vehicles/sales/views.py
./vehicles/sales/urls.py
./vehicles/sales/templates/
./vehicles/sales/templates/sales/invoices.html
./vehicles/sales/static/
./vehicles/sales/static/js/app/invoices/
./vehicles/sales/static/js/app/invoices/main.js
./vehicles/sales/static/js/app/invoices/app.js
./vehicles/sales/static/js/app/invoices/...
./static/
./media/
./templates/
./templates/base.html
./templates/...

Далее по аналогии. Если нужна какая-то мелочь - отправляем ее в соответствующее "корневое" приложение; если мелочь становится более серьезным куском функционала в рамках той же предметной области - создаем ей отдельное приложение внутри уже существующего. Все, что выходит за рамки предметной области - новое "корневое" приложение.
Ответ написан
Комментировать
@bromzh
Drugs-driven development
Блин, да это же джанго, он сам явно подталкивает к одной структуре приложения.
Одно приложение на 1 логическую и независимую часть сайта. Например, интернет-магазин должен включать в себя каталог продукции и функционал для заявок. Потому что они взаимосвязаны. А вот новостную часть на этом сайте надо выносить в отдельное приложение, так как новости обычно почти не связаны с заказами и товарами как таковыми.
Ещё в каждом приложении можно создавать папку static, куда класть все статические файлы. Но так обычно поступают разрабы "плагинов" для джанги. В рамках сайта можно коласть в 1 папку static в корне проекта, но разделяя js и css файлы (чтобы вёрстка не было в 1-м суперогромном css файле, в котором хрен чо найдёшь). Потом сборщики должны всё собирать и минимизировать.
Шаблоны раскидывай по папкам, соблюдая иерархию. Т.е. если есть приложение shop, то в корневой папке templates создай layout.html, а все шаблоны магазина клади внутрь templates/shop, наследуя. Также можно хранить шаблоны внутри приложения, но опять же, это обычно используют разрабы "плагинов", хотя сам принцип хорош.
Ответ написан
atomheart
@atomheart
Пишу на Python за карму и за деньги
Есть замечательная книга "Two Scoops of Django 1.8" (best practices), легко гуглится. Книга не переведена на русский, но читается легко. В ней описаны практические решения выше обозначенных вопросов по организации проекта и много чего еще интересного и правильного.

А вообще, Django позволяет переорганизовать проект по удобной разработчику схеме и делается это достаточно просто.

Обычно я делаю вместо папки главного проекта - папку config (с файлом settings.py), так же идет общая папка с шаблонами (которые разбиты по приложениям), а логические части проекта разбиваю на приложениям.

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

./manage.py
./config/
./config/settings.py
./config/ursl.py
./templates/blog/
./templates/blog/base.html
./templates/blog/about.html
./templates/accounts/
./templates/accounts/login.html
./templates/accounts/registration.html
./acccounts/
./acccounts/urls.py
./acccounts/...
./blog/
./blog/urls.py
./blog/...


Но есть у меня проект, где только папка config, а все остальное - динамически создаваемый контент.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы