1

我的 Django 项目使用的包之一有一个简单的管理类,如下所示:

class EventUpdateInline(admin.StackedInline):
    model = EventUpdate

class EventAdmin(admin.ModelAdmin):
    form = EventForm
    list_display = ('date_created', 'description', 'status', 'date_updated')
    search_fields = ('description', 'message')
    list_filter = ('services',)
    inlines = [EventUpdateInline]

我编写了一个EventUpdateInline我想使用的自定义类。我怎样才能EventUpdateInline用我的CustomEventUpdateInline班级代替?

这是第一个问题。问题的第二部分是我想向EventUpdate模型添加一个自定义属性,以便我的CustomEventUpdateInline类可以使用它。

我将把我的代码放在哪里来导入我的CustomEventUpdateInline并替换旧的和旧的将自定义属性添加到EventUpdate模型中?

我不确定这是否可能。谢谢

4

1 回答 1

4

编辑:

tl;dr:fork 并改用 pip/virtualenv - 这是一种更清洁、可维护和理智的方法。猴子修补通常是一个糟糕的主意 - 请参阅链接到 SO 答案。但有时它是较小的邪恶。

如果你想要一个快速而肮脏的猴子补丁 - https://stackoverflow.com/a/6720998/473285

但是,通常这些天,如果项目位于 github 或 bitbucket 上,或者我只是克隆它,请进行更改,然后使用pip -e(您正在使用virtualenv,对吗?)安装我的克隆版本。如果您认为您的更改将被上游接受,这是最好的方法。

要考虑的另一件事是前向兼容性。将第三方软件包更新到更高版本后,您的猴子补丁仍然有效吗?您在 git 中的更改会干净地合并吗?

通常我会在一些或所有这些罕见的情况下使用猴子补丁:

  • 您正在编写一个用于分发的软件包,但您需要修改另一个第三方软件包才能正常工作(很少见,仅在第三方维护者不接受补丁时才有效)
  • 您正在对类、方法或函数进行相对直接的替换,这些类、方法或函数将与包的内部结构完美结合。
  • 代码不可用或不是使用 pip/virtualenv 易于使用的形式(罕见)
  • 您认为代码不会升级,或者您永远需要升级(不太可能)
  • 您没有使用 pip/virtualenv (不好,但有时对于旧版、非常规或配置错误的安装是不可能的)。
  • 您不认为上游维护者会接受您的更改,或者认为它们对其他人有用。

如果您正在进行更多涉及的更改或更广泛有用的事情,那么最好经常分叉然后尝试被上游接受。即使您的更改是为了促进纯内部的东西,这些东西永远不会在您的项目之外的任何地方使用,virtualenv 也是一种更好的方法。

于 2012-10-16T09:04:14.157 回答