2012-10-16 43 views
0

一说我的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类,我想使用。我如何用我的CustomEventUpdateInline类代替EventUpdateInline

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

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

我不确定这是否可能。由于

回答

3

编辑:

TL;博士:叉和使用PIP/virtualenv中,而不是 - 这是一个更清洁,维护和理智的方式。猴子补丁通常是一个可怕的想法 - 看到链接到SO答案。但有时它是更小的邪恶。

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

但是通常这些天,如果该项目在GitHub上或到位桶或不管我只是复制它,让我修改,然后安装使用pip -e我的克隆版本(你正在使用virtualenv,对吧?)。如果您认为您的更改会被上游接受,这是最好的方法。

要考虑的另一件事是转发兼容性。将第三方软件包更新到更高版本后,您的猴子补丁程序仍然可以工作吗?你的git变化会干净地融合吗?

一般来说,我会用猴子修补下部分或所有这些罕见的情况下:

  • 你正在写一个分发包,但你需要修改其他第三方软件包把事情的工作(罕见,只有当第三方维护人员不会接受补丁时才有效)
  • 您正在做一个相对直接的插入式替换类,方法或函数,它们将与包的内部进行干净地网格化。
  • 该代码不可用或不是一种易于使用pip/virtualenv(罕见)的形式
  • 您不认为代码将被升级,或者您将需要升级(不太可能)
  • 你没有使用pip/virtualenv(坏,但有时不适用于传统,非传统或配置错误的安装)。
  • 您不认为上游维护人员会接受您的更改,或者他们将永远不会对其他人有用。

如果您正在做更多的更改或更广泛的用途,那么经常分叉然后尝试接受上游是最好的。即使你的改变是为了方便纯粹的内部东西,永远不会在你的项目之外的任何地方使用,virtualenv是更好的方法。