2012-02-25 4 views
3

Я новичок в Django и довольно смущен тем, как лучше всего интегрировать сторонние приложения. В моей (возможно наивной) интерпретации DRY я хочу свести к минимуму копирование/вставку не только моего собственного кода, но и кода других людей, поэтому я доволен, например, шаблоном использования contrib.auth, как в основном черного если мне нужна дополнительная информация об auth.User (путем расширения auth.User с объектом UserProfile или наследованием). Именно так я и предполагал, что буду использовать большинство сторонних приложений.интеграции сторонних приложений и шаблонов django

Однако я быстро обнаружил, что это было очень сложно, поэтому теперь я смирился с «копиями» всех моих сторонних приложений, живущих внутри моей папки проекта, которые в основном являются целыми копиями с минимальными изменениями. Последняя солома заключалась в том, что я хотел добавить базовый блог (я остановился на django-basic-blog) и мне нужно просто сменить один шаблон, и я не думал о лучшем решении, кроме как сделать копию этого приложения в моем проекте с помощью один шаблон изменен.

Мои вопросы:

  • в данном конкретном случае, когда мне нужно изменить только один шаблон, это (скопировать все приложения более) лучшее, что я могу сделать? Если бы мне просто нужно было сменить одну модель, я мог бы сохранить стороннее приложение практически без изменений и сделать наследование модели в моем собственном приложении ...
  • в целом, эта практика копирования приложений в рамках моего проекта и исправления каждого из них маленький кролик чувствует себя безумно расточительным и грязным. Также кажется, что если я использую часто обновляемое стороннее приложение, будет больно синхронизировать изменения. Должен ли я просто научиться любить бомбу или есть какая-то очевидная архитектурная схема/помощь, предоставляемая Django, которую я пропускаю?

ответ

5

Вы не должны изменять код сторонних модулей, так как трудно отслеживать изменения и создает беспорядок с тем же кодом, который был скопирован во многие проекты. Типичным решением является наличие только одной версии каждого стороннего модуля в вашем пути python, а не в директории вашего проекта. Этот единый пакет может быть повторно использован всеми вашими проектами.

Однако для шаблонов необходим другой подход, поскольку их часто необходимо модифицировать для каждого проекта. Вот почему Django поставляется с settings.TEMPLATE_DIRS и settings.TEMPLATE_LOADERS.

TEMPLATE_DIRS указывает список каталогов, содержащих файлы шаблонов. TEMPLATE_LOADERS определяет классы, используемые для загрузки шаблонов. Погрузчики будут использоваться для того, чтобы они были определены, и каталоги будут пройдены, чтобы они были определены. Таким образом, вы можете искать шаблоны в каталоге вашего проекта сначала и в других модулях в качестве резервной копии.

Так что вам не нужно копировать весь модуль python для изменения одного шаблона. Скопируйте только каталог шаблонов этого стороннего модуля или даже только один шаблон, который вы хотите изменить. Если вы положите нужное место и добавьте путь в TEMPLATE_DIR, Django будет использовать его.

+0

ах. Спасибо. Это прекрасно отвечает моему первому вопросу. – yanzhang

+0

, также из вашего ответа вы, кажется, подразумеваете, что почти всегда есть возможность использовать сторонние модули без явного изменения их кода. Позвольте мне теперь угадать, что вы научили меня шаблонам: похоже, для каждого стороннего приложения «ИхАпп» я должен создать каталог «MyApp», в котором я импортирую/расширяю модели и представления из ихApp, создаю/шаблонов (и убедитесь, что порядок прав в TEMPLATE_LOADERS), и добавьте оба параметра MyApp и MyApp в настройки. Правильно ли это? – yanzhang

+0

В вашем проекте обычно есть каталог «/ templates», в котором находятся ваши шаблоны. Положите там и другие шаблоны. –

Смежные вопросы