2012-10-16 68 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是更好的方法。