やあ、
管理パネルで、製品を追加するためのフォームを作成しました。製品に関連するモデルがいくつかあるため、フォームには2つのインラインフォームセットが含まれます。ユーザーは製品を作成し、属性が異なるその製品のバリエーションを定義できます。これを例を挙げて説明します。ユーザーは、3つの異なる色の1つのブランドのTシャツを持っていて、それらを異なる価格で追加したいと考えています。Tシャツは3つのバリエーションを持つ製品として作成されます。
class Detail(models.Model):
product = models.ForeignKey('Product')
attribute = models.ForeignKey('Attribute')
value = models.CharField(max_length=500)
class Attribute(models.Model):
name = models.CharField(max_length=300)
class Variant(models.Model):
product = models.ForeignKey(Product)
details = models.ManyToManyField(Detail)
quantity = models.IntegerField()
price = models.DecimalField(max_digits=6, decimal_places=2)
関係ないのでProductを省略しました。
class DetailInline(admin.TabularInline):
model = Detail
class VariantInline(admin.StackedInline):
model = Variant
class ProductAdmin(admin.ModelAdmin):
class Meta:
model = Product
inlines = [DetailInline, VariantInline]
これはうまく機能し、モデルは正常に保存されます。バリアントのインラインに問題があります。バリアントはインラインで詳細オブジェクトを表示しますが、データベースにすでに保存されているオブジェクトのみです。ユーザーの生活を楽にするためには、詳細オブジェクトの作成時に詳細オブジェクトをバリアントインラインに追加するのが最善です。そのため、製品を保存する前に追加する必要があります。
- インラインを値で手動で更新する方法はありますか?
- 詳細オブジェクトを作成するために使用できるが、製品を作成して結果を返すために使用できる保存の途中はありますか?
- モデルを再設計する必要がありますか?(私がしなければならない場合を除いて、私は本当にこれをしたくありません)
- 製品を追加するためにユーザーが従う必要のあるさまざまなワークフローはありますか?
jsを使用してエントリをインラインに挿入しようとしましたが、これはハックであり、Djangoは誤った値が選択されたというエラーをスローする偽の値でフォームセットを検証しませんでした。
この質問を書いているときに頭に浮かんだ最終的な考え。オブジェクトのインライン形式が変更された場合に、オブジェクトを作成して結果を返すカスタムビューにデータを渡すjsを作成することができます。私が見ている問題の1つは(正しく感じられないことは別として)、新しいオブジェクトが作成されたことをdjangoに通知して、存在しない値についてエラーが発生しないようにする方法です。
とにかく、誰かがこの長い質問を理解してくれることを願っています。