2010-11-07 5 views
6

Предположим, я использую приложение django-tagging, и я решил, что хочу добавить класс формы к существующим формам тегов. Я не хочу исправлять форму в существующие формы.py, так как она будет удалена при обновлении. Как мне расширить form.py, чтобы включить мой класс формы?Как вы расширяете приложение для подключения django?

Я попытался добавить в мое приложение папку «tagging» с помощью формы .py, которая включала только мой класс, но это нарушает классы форм установленного приложения. (Я знаю, что это был длинный выстрел, просто подумал, что я попробую).

Любые предложения по поиску информации о добавлении класса формы в существующее приложение?

+0

Оформить заказ [Изменение/Расширение сторонних приложений django] (http://stackoverflow.com/a/8442736/2698552) – ChillarAnand

ответ

2

Jacob Kaplan-Moss, оригинальный разработчик Django, answers your question in the abstract (поскольку ваш вопрос был абстрактным в первую очередь) на страницах с 185 по 203 его презентации «Django In the Real World».

Однако для этого совета разработчик плагина должен написать свое приложение в соответствии с руководящими принципами.

+0

Спасибо за информацию, я действительно удивлен, что нет способа сделать это из коробки. Думаю, я создам новое приложение с формой, использующей модели и т. Д. Из установленного подключаемого приложения. – chris

+1

Мне нравятся еще несколько источников. Эта презентация длится 500 кликов. – jozxyqk

+0

Прямая ссылка на слайд 185 -> http://www.slideshare.net/jacobian/django-in-the-real-world-1750000/185 –

4

Простой ответ: вы наследуете классы форм, создаете свои собственные модификации и используете свою измененную версию.

Таким образом, вместо того, чтобы импортировать из taggit, вы бы импортировать из собственного forms.py

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

Недостатком этого подхода является то, что вы не можете изменять поведение внесенного приложения. Поэтому, если вы хотите, чтобы какая-либо внутренняя функциональность taggit использовала ваш пользовательский код, это трудно реализовать. Однако это очень редкий случай.

Если вы действительно хотите это сделать (как я должен был сделать один раз), вы можете клонировать источник и сохранять свою собственную копию. Создайте ветку с вашими изменениями и убедитесь, что вы пишете хорошие тесты.

Затем вы должны добавить этот код в проект django как свое собственное приложение; из-за правил поиска Python - он найдет вашу локальную копию и будет использовать ее вместо одной из каталога глобальных пакетов сайтов.

Если восходящий поток обновлен, вам необходимо сохранить свою копию, убедившись, что тесты не сбой при обновлении/переустановке.

+0

В общем случае очевидный бит создает локальное приложение django, то есть [ 'startapp'] (https://docs.djangoproject.com/en/dev/intro/tutorial01/), наследуя то, что вы хотите и добавляете функции, но я собираюсь получить django для использования вашего кода приложения вместо унаследованного, зависит от базовое приложение. Не могли бы вы рассказать о возможных способах использования django приложения после добавления его в 'INSTALLED_APPS', например, через' urls.py', и как вы могли бы подключиться к вашему приложению? Есть только одна точка входа, и вам нужно изменить каждый бит кода вниз по строке, чтобы перейти к бит, который вы хотите изменить? – jozxyqk

+0

[комментарии django] (https://docs.djangoproject.com/en/1.4/ref/contrib/comments/custom /) предоставляет 'COMMENTS_APP' и ожидает' get_model'/'get_form' в' __init __. Py', который с моей точки зрения скрывает взаимодействие между django и приложением. Если это не предусмотрено, существует ли стандартный способ замены формы моим собственным? – jozxyqk