0

Treatmentこれは、多くの " " モデル (TreatmentA, TreatmentBなど)の抽象基本クラスです。

class TreatmentBase(models.Model):
    URL_PREFIX = '' # child classes define this string

    code = shared.models.common.RandomCharField(length=6) 

    class Meta:
        abstract = True

Treatmentインスタンスには URL があり、ユーザーがアクセスすると、その処理に固有のページに移動します。Django Admin で治療を作成し、すぐにこの URL を取得して、ユーザーに送信できるようにしたいと考えています。この URL は、TreatmentBase で次のメソッドを使用して作成できます。

    def get_url(self):
        return '{}/{}/'.format(self.URL_PREFIX, self.code)

ただし、この URL を Django Admin に表示する方法に行き詰まっています。次の解決策を考えることができます。

(1) フィールドの表示をカスタマイズしてcode、クリック可能な URL にします。問題: これを行う方法がわかりません。

get_url(2)メソッドを に追加しModelAdmin.list_displayます。問題: これはlist_display、 の子モデルごとに個別に を定義する必要BaseTreatmentがあり、モデルのすべてのフィールドを明示的にリストする必要があることを意味します。つまり、モデルを変更するたびに更新する必要があり、DRY に違反します。

(3) 次のようにフィールドを追加します。

    url = models.URLField(default = get_url)

問題:get_urlはインスタンス メソッドであり (フィールドを参照する必要があるため)、デフォルトの引数に関するドキュメントをself.code読んだところ、引数のない単純な callable である必要があります。

この一見単純なタスクを実行する方法はありますか?

4

1 に答える 1

0

オプション 2 (管理画面への追加) を使用すること readonly_fieldsもできますが、モデルが変更されたときの DRY の問題を軽減するために追加することもできます。

saveオプション 3 (追加のフィールド) は、URL プロパティを設定するメソッドをオーバーライドする場合にも機能します。save管理者でフィールドを読み取り専用として設定するか、現在の場合はメソッドで値のみを設定する必要がありますNone

于 2013-07-04T12:16:32.253 に答える