你如何扩展django可插拔应用程序?

时间:2010-11-07 15:27:01

标签: django extending

假设我使用的是django-tagging应用程序,我决定将表单类添加到现有的标记表单中。我不想将表单修补到现有的forms.py中,因为它会在更新时被烧毁。如何扩展forms.py以包含我的表单类?

我尝试在我的应用中添加一个“标记”文件夹,其中的forms.py仅包含我的类,但会破坏已安装的应用的表单类。 (我知道这是一个很长的镜头,只是想我会尝试一下)。

有关在何处查找有关向现有应用程序添加表单类的信息的建议?

2 个答案:

答案 0 :(得分:5)

简单的答案是,您从表单类继承,创建自己的修改,并使用修改后的版本。

因此,您可以从自己的forms.py

导入,而不是从taggit导入

当我想要装饰/增强现有应用程序的功能时,我已经多次这样做了。缺点是如果文档很差,您必须深入了解源代码以找出调用堆栈的内容以及要修改的功能的继承树。

此方法的缺点是您无法修改提供的应用程序的行为。因此,如果您希望taggit的某些内部功能使用您的自定义代码 - 这很难实现。但是,这是一种非常罕见的情况。

如果您真的想这样做(因为我必须做一次),您可以克隆源并维护自己的副本。创建一个包含修改的分支,并确保编写好的测试。

然后,您应该将此代码作为自己的应用程序添加到您的django项目中;由于Python的查找规则 - 它将找到您的本地副本并使用它而不是全局site-packages目录中的副本。

如果上游已更新,那么您的负担就是通过确保在更新/重新定位时测试不会失败来维护您的副本。

答案 1 :(得分:2)

Jacob Kaplan-Moss,Django的原始开发人员,answers your question in the abstract(因为你的问题首先是抽象的),在他演讲的第185到203页,“Django In the Real World”。

但是,为了应用该建议,插件开发人员必须按照指南编写他的应用程序。