0

たとえば、次のような基本クラスがあるとします。

class Base(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    value1 = models.CharField(max_length=50)
    value2 = models.CharField(max_length=50)

ここで、いくつかのタイプのオブジェクトをテーブルに入力しています。その中には、データの一部を使用するものもあれば、他の部分を使用するものもあり、すべて共通の部分 (この例では名前) を使用しています。

完全なリストが必要ですが、オブジェクトをクリックしたときに、そのタイプに応じて異なるビューが必要です。modelAdmin の変更には、次のようなものがあります。クラスの 1 つはインラインを使用し、他のクラスは使用しない、list_display が異なる、追加の CSS があるなど。基本的に、異なる modelAdmin について話しています。

私が考えている代替案: 1 つは、これらの型のそれぞれが Base をサブクラス化することです。

class Type1(Base):
    pass

class Type2(Base):
    pass

次に、それぞれに modelAdmin を定義し、Base クラスに 1 つ定義して、すべてを一覧表示するテーブルを取得します。この例では、/app/base/id ではなく、タイプに応じて /app/type1/id、/app/type2/id などに移動するようにリンクをオーバーライドします。これらのそれぞれについて、modelAdmins を変更して、保存後に /app/type に戻るようにします

別の代替手段は、単一のモデルと単一の modelAdmin を持ち、change_view に使用しているすべてのメソッドをオーバーライドして、レンダリングしているオブジェクトのタイプ、つまり get_inline_instances、get_formsets など、list_display、list_display_links、list_filter を変更する必要があるものをすべてオーバーライドすることです。など

最初の選択肢は私にはずっときれいに見えますが、modelAdmin でメソッドを定義する以外にリンクを変更する方法がわかりません。

私が見逃している簡単な方法はありますか?どのようにしますか?

ああ、それは管理者を使用する必要があります。ビューまたは別のモデルを使用してこれを行いたいのですが、残念ながらこれがそうあるべきです。最高司令部は、すべてを 1 つのテーブルにまとめたいと考えています。

ありがとう!。

編集:また、私はこれを見つけたばかりで、良さそうです:

http://django-polymorphic.readthedocs.org/en/latest/admin.html

4

1 に答える 1

0

Django-Polymorphic は間違いなく進むべき道のようです。使い方は簡単で、プロキシでは複製できなかったベース オブジェクトをクリックすると、正しい modelAdmin が自動的に表示されます。

唯一の問題は、子クラスに追加のフィールドがなくても、子クラスごとにテーブルが作成され、子クラスから何も回復されない場合でも、子クラスごとに追加のクエリが実行されることです (テーブルの列のみが外部です)ベースオブジェクトへのキー)。

しかし、それは機能します。私はそれで暮らすことができます。

于 2014-05-05T08:02:55.163 に答える