1

私の Django プロジェクトが使用するパッケージの 1 つには、次のような単純な管理クラスがあります。

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クラスに置き換えるにはどうすればよいですか?

それが最初の問題です。問題の 2 番目の部分は、カスタム プロパティをEventUpdateモデルに追加して、CustomEventUpdateInlineクラスで使用できるようにしたいということです。

私のコードをインポートCustomEventUpdateInlineして古いものを置き換え、古いカスタムプロパティをEventUpdateモデルに追加するには、どこにコードを配置しますか?

これが可能かどうかはわかりません。ありがとう

4

1 に答える 1

4

編集:

tl;dr: フォークして、代わりに pip/virtualenv を使用してください。これは、はるかにクリーンで保守しやすく、健全なアプローチです。モンキーパッチは一般的にひどい考えです - SOの回答へのリンクを参照してください。しかし、時にはそれはより小さな悪です。

迅速で汚いモンキー パッチが必要な場合 - https://stackoverflow.com/a/6720998/473285

ただし、最近では通常、プロジェクトが github や bitbucket などにある場合は、クローンを作成し、変更を加えてから、クローン バージョンを使用してインストールしpip -eます (使用していますよvirtualenvね?)。これは、変更が上流で受け入れられると思われる場合に最適な方法です。

考慮すべきもう1つのことは、前方互換性です。サードパーティのパッケージを新しいバージョンに更新した後も、モンキー パッチは機能しますか? git での変更はきれいにマージされますか?

一般的に、これらのまれな状況の一部またはすべてでは、モンキー パッチを使用します。

  • 配布用のパッケージを作成しているが、機能させるために別のサードパーティ パッケージを変更する必要がある (まれに、サードパーティのメンテナがパッチを受け入れない場合にのみ有効)
  • パッケージの内部ときれいに噛み合うクラス、メソッド、または関数の比較的簡単なドロップイン置換を行っています。
  • コードが利用できないか、pip/virtualenv を使用して簡単に操作できる形式になっていない (まれ)
  • コードがアップグレードされない、またはアップグレードする必要があるとは思わない (可能性は低い)
  • pip/virtualenv を使用していません (悪いですが、レガシー、型にはまらない、または不適切に構成されたインストールでは不可能な場合があります)。
  • 上流のメンテナーがあなたの変更を受け入れたり、他の誰かにとって役立つとは思えません。

より複雑な変更や、より広く役立つ何かを行っている場合は、多くの場合フォークしてから、上流で受け入れられるようにするのが最善です。あなたの変更が、あなたのプロジェクトの外部では絶対に使用されない純粋に内部的なものを促進するためのものであるとしても、virtualenv ははるかに良い方法です。

于 2012-10-16T09:04:14.157 に答える