2012-06-26 19 views
7

私は、他のフィールド選択に基づいてフィールドのデフォルト値を設定しようとしています。Djangoは他のフィールドに基づいてフィールド値を動的に設定します。

class Product(models.Model): 
     description = models.CharField('Description', max_length=200) 
     price = models.FloatField('Price') 

class Sell(models.Model): 
     product = models.ForeignKey(Product) 
     price = models.FloatField('Price') 

各「製品」はデフォルトの価格(または希望価格)を持っているので、ユーザーは、管理ページで、新しい販売を追加したいとき、彼/彼女が選ん: は基本的に、これらはクラスでありますProduct.priceから提示価格をSell.priceに動的にコピーする必要があります。 その時点でユーザーが変更できるため、「保存」メソッドを使用することはできません。

JavaScriptを明示的に使用する必要がありますか?またはDjangoでそれを行うためのエレガントな方法はありますか?

答えて

3

これは、事前セーブフックで、またはSellモデルのsave()メソッドをオーバーライドすることで対応できます。

+1

もう1つの方法は、モデルの 'clean()'メソッドの 'price'フィールドを初期化することです。 'save()'をオーバーライドするのと似ていますが、 'super()'を呼び出す必要がないのでクリーナーです。これはフレームワークフックです。 –

1

管理者のウェブページでフォームフィールドの値を動的に更新するよう求めていますか?クライアント側フォームの動作は、JavaScriptで行う必要があります。 Djangoの管理者は、特にInlinesの追加/削除のためのスクリプトを提供していますが、このレベルでの機能は提供していません。

Djangoの管理者は、window.django.jQuery(またはちょうどdjango.jQuery)のページコンテキストでjQueryを提供しています。 Djangoフォームは常に安定したフォームフィールドIDを出力します。出力フォームコードを調べ、Productセレクターとそれに対応するSell.price入力フィールドを探します。次に、jQueryを使用して、.change()または.on('change', ...)ハンドラをProductセレクタに追加し、Sellフィールドの価格を更新する関数を追加することができます。今後の参考のために

は、Djangoの管理者は、ほとんどDateTimeField型、ForeignKeyの、また のManyToManyFieldフィールドを受け付けないModelAdmin.prepopulated_fieldsしかし

prepopulated_fieldsとあなたの要求を満たしています。

関連する問題