2010-11-07 70 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

相关问题