【问题标题】:How do you extend a django pluggable app?您如何扩展 django 可插拔应用程序?
【发布时间】:2010-11-07 15:27:00
【问题描述】:

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

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

关于在哪里查找有关将表单类添加到现有应用程序的信息的任何建议?

【问题讨论】:

标签: django extending


【解决方案1】:

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

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

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

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

如果您真的想这样做(就像我曾经做过的那样),您可以克隆源代码并维护自己的副本。使用您的修改创建一个分支,并确保您编写了良好的测试。

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

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

【讨论】:

  • 在一般情况下,显而易见的一点是创建一个本地 django 应用程序,即startapp,继承您想要的内容并添加功能,但我收集让 django 使用您的应用程序代码而不是继承的代码取决于基础应用程序。您能否详细说明 django 在将应用程序添加到INSTALLED_APPS 后可能使用的方式,例如通过urls.py,以及您可以如何挂钩您的应用程序?是否只有一个入口点,您必须修改每一位代码才能到达您想要更改的位?
  • django comments 提供COMMENTS_APP 并期望get_model/get_form__init__.py 中,从我的角度来看,这隐藏了django 和应用程序之间的交互。如果没有提供,是否有一种标准方法可以用我自己的表格替换表格?
【解决方案2】:

Jacob Kaplan-Moss,Django 的原始开发者,answers your question in the abstract(因为您的问题首先是抽象的)在他的演示文稿“现实世界中的 Django”的第 185 页到第 203 页上。

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

【讨论】:

  • 感谢您提供的信息,实际上我很惊讶没有开箱即用的方法。我想我将创建一个新应用程序,其表单使用已安装的可插拔应用程序中的模型等。
  • 我想要更多的资源。该演示文稿的点击次数太长了 500 次。
猜你喜欢
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多