9

外部の他のフィールド選択に基づいてフィールドのデフォルト値を設定しようとしています。基本的に、これらはクラスです:

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でそれを行うためのエレガントな方法はありますか?

4

2 に答える 2

3

pre-save フックを使用するか、Sell モデルの save() メソッドをオーバーライドすることで、これに取り組むことができます。

from django.db import models

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')

    # One way to do it:
    from django.db.models.signals import post_save
    def default_subject(sender, instance, using):
        instance.price = instance.product.price
    pre_save.connect(default_subject, sender=Sell)

    # Another way to do it:
    def save(self, *args, **kwargs):
        self.price = self.product.price
        super(Sell, self).save(*args, **kwargs)
于 2012-06-26T16:51:50.667 に答える
1

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

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

今後の参考のために、Django Admin はModelAdmin.prepopulated_fieldsでリクエストをほぼ満たしますが、

prepopulated_fields は、DateTimeField、ForeignKey、または ManyToManyField フィールドを受け入れません。

于 2012-06-26T18:54:05.010 に答える