假设我正在使用 django-tagging 应用程序,并且我决定要向现有的标记表单添加一个表单类。我不想将表单修补到现有的 forms.py 中,因为它会在更新时被炸毁。如何扩展 forms.py 以包含我的表单类?
我尝试在我的应用程序中添加一个“标记”文件夹,其中包含一个仅包含我的类的 forms.py,但这会破坏已安装应用程序的表单类。(我知道这是一个很长的镜头,只是想我会试一试)。
关于在哪里查找有关将表单类添加到现有应用程序的信息的任何建议?
简单的答案是,您从表单类继承,创建自己的修改,并使用修改后的版本。
因此,您可以从自己的 forms.py 中导入,而不是从 taggit 导入
当我想装饰/增强现有应用程序的功能时,我已经多次这样做了。缺点是如果文档很差,您必须深入研究源代码以找出调用堆栈是什么以及要修改的功能的继承树。
这种方法的缺点是您不能修改贡献的应用程序的行为。因此,如果您希望 taggit 的某些内部功能使用您的自定义代码 - 这很难实现。但是,这是非常罕见的情况。
如果您真的想这样做(就像我曾经做过的那样),您可以克隆源代码并维护自己的副本。使用您的修改创建一个分支,并确保您编写了良好的测试。
然后,您应该将此代码作为自己的应用程序添加到您的 django 项目中;由于 Python 的查找规则 - 它会找到您的本地副本并使用它而不是全局站点包目录中的副本。
如果上游更新了,那么您的负担就是通过确保更新/变基时测试不会失败来维护您的副本。
Jacob Kaplan-Moss,Django 的原始开发者,在他的演讲“现实世界中的 Django”的第 185 页到第 203 页上以 摘要的形式回答了您的问题(因为您的问题首先是抽象的)。
但是,为了应用该建议,插件开发人员必须按照指南编写他的应用程序。