2010-11-07 80 views
6

假設我正在使用django-tagging應用程序,並決定要將表單類添加到現有的標記表單中。我不想將表單修補到現有的forms.py中,因爲它在更新時會被清除。如何擴展forms.py以包含我的表單類?如何擴展django可插拔應用程序?

我嘗試在我的應用程序中添加一個僅包含我的類的forms.py的「標記」文件夾,但這會打破已安裝的應用程序的窗體類。 (我知道這是一個長鏡頭,只是想我會試試看)。

有關向何處查找有關將表單類添加到現有應用程序的信息的任何建議?

+0

結帳[修改/擴展第三方Django應用程序](http://stackoverflow.com/a/8442736/2698552) – ChillarAnand 2014-09-03 13:50:28

回答

2

Jacob Kaplan-Moss,Django的原始開發人員,answers your question in the abstract(因爲您的問題首先是抽象的)在他的演示文稿第185至203頁「Django在真實世界中」。

但是,爲了適用該建議,插件開發人員必須根據指導原則編寫應用程序。

+0

感謝您的信息,我真的很驚訝,沒有辦法做到這一點的盒子。我想我會創建一個新的應用程序,使用安裝的可插件應用程序中的模型等。 – chris 2010-11-08 08:15:02

+1

我喜歡更多的來源。該演示文稿太長時間點擊500次。 – jozxyqk 2014-08-31 07:38:20

+0

直接鏈接到幻燈片185 - > http://www.slideshare.net/jacobian/django-in-the-real-world-1750000/185 – 2017-01-04 19:38:01

4

簡單的答案是,您從表單類繼承,創建自己的修改,並使用您的修改版本。

所以,而不是從taggit進口,你會從你自己的forms.py

導入時,我想裝飾/增強現有應用程序的功能,我已經做了很多次。缺點是如果文檔不好,你必須挖掘源代碼來找出調用堆棧是什麼以及你想要修改的功能的繼承樹。

這種方法的缺點是您無法修改提供的應用程序的行爲。所以如果你想要taggit的一些內部功能來使用你的自定義代碼 - 這很難實現。但是,這是非常罕見的情況。

如果您真的想這樣做(因爲我必須做一次),您可以克隆源代碼並維護您自己的副本。用你的修改創建一個分支,並確保你編寫好的測試。

然後,您應該將此代碼作爲自己的應用程序添加到您的django項目中;由於Python的查找規則 - 它會找到您的本地副本並使用它來代替全局site-packages目錄中的副本。

如果更新上游,那麼您的負擔就是維護您的副本,確保在更新/重新綁定時測試不會失敗。

+0

在一般情況下,顯而易見的是創建一個本地django應用程序,即[ 'startapp'](https://docs.djangoproject.com/en/dev/intro/tutorial01/),繼承你想要的並添加功能,但我收集讓django使用你的應用代碼而不是繼承的代碼取決於基本應用程序。您能否詳細說明django在將其添加到'INSTALLED_APPS'之後可能會使用某個應用程序的可能方式,例如通過'urls.py',以及您如何掛鉤您的應用程序?是否只有一個入口點,你需要修改每一行代碼才能找到想要更改的位? – jozxyqk 2014-09-04 07:14:58

+0

[django評論](https://docs.djangoproject.com/en/1。4/ref/contrib/comments/custom /)提供了'COMMENTS_APP',並期望'__init __。py'中的'get_model' /'get_form',從我的角度來看,隱藏了django和應用之間的交互。如果沒有提供,是否有一個標準的方法來替換我自己的表單? – jozxyqk 2014-09-04 07:16:56

相關問題