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

chr*_*ris 6 django extending

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

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

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

Bur*_*lid 5

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

因此,您可以从自己的forms.py导入,而不是从taggit导入

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

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

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

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

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


Elf*_*erg 2

Jacob Kaplan-Moss,Django 的原始开发者,在他的演讲“现实世界中的 Django”的第 185 页到 203 页上抽象地回答了你的问题(因为你的问题一开始就是抽象的)。

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