こんにちは、私は製品を追加するためのフォームを作成した管理者パネルでDjangoの管理:他のインライン
に基づいて更新インライン。製品に関連するいくつかのモデルがあるため、2つのインラインフォーマットが含まれています。ユーザーは商品を作成してから、異なる属性の商品のバリエーションを定義することができます。これを例を用いて説明します。ユーザーは1つのブランドのTシャツを3色展開していて、それらを異なる価格で追加したいと考えています。 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)
私はこの商品をお断りしました。
class DetailInline(admin.TabularInline):
model = Detail
class VariantInline(admin.StackedInline):
model = Variant
class ProductAdmin(admin.ModelAdmin):
class Meta:
model = Product
inlines = [DetailInline, VariantInline]
これはうまく動作し、モデルが正しく保存されています。私はバリアントインラインに問題があります。バリアントインラインディテールオブジェクトは、データベースにすでに保存されているものだけを表示します。ユーザーの生活をより快適にするために、Detailオブジェクトを作成するときにVariantインラインにDetailオブジェクトを追加することがあります。そのため、Productが保存される前にそれを実行する必要があります。
- インラインで値を手動で更新する方法はありますか?
- Detailオブジェクトを作成するのにProductを使用せず、結果を返すために使用できる中間保存はありますか?
- モデルを再設計する必要がありますか? (私がしなければ本当にこれをしたくない)
- 製品を追加するためにユーザーが従う必要のあるワークフローはありますか?
私はJSを使用することにより、インラインにエントリを注入しようとしたが、これはハックで、Djangoは偽の値が間違った値が選択されていたことがエラーを投げてフォームセットを検証しませんでした。
私はこの質問を書いている間私の心に来た最終的な考え。インライン形式のオブジェクトが変更された場合、オブジェクトを作成して結果を返すカスタムビューにデータを渡す場合に、jsを作成することは可能です。私が見ている問題の1つは、新しいオブジェクトが作成されたことをdjangoに知らせる方法です(既存の値が存在しないことについてはエラーが発生しません)。
とにかく誰かがこの長い質問を理解してくれることを願っています。
何か特定の理由のために、製品に、代わりのバリアントに詳細を抱き合わせていますか? –
はい私はそうです。 jsでデータをフィルタリングするために使用されます。 –