6

やあ、

管理パネルで、製品を追加するためのフォームを作成しました。製品に関連するモデルがいくつかあるため、フォームには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に通知して、存在しない値についてエラーが発生しないようにする方法です。

とにかく、誰かがこの長い質問を理解してくれることを願っています。

4

2 に答える 2

2

頭に浮かぶのはKnockout.jsです。

DOM 内の多数の要素を同時に更新するのに非常に優れており、クライアント側イベントからの Ajax 呼び出しを使用して、新しい値をカスタム ビューに簡単にプッシュできます。

これを実行できるフレームワークはいくつかありますが、Backbone、Angular、Ember などの最も人気のあるフレームワークの中で、Knockout は読みやすく、実装しやすいものの 1 つだと思います。

Django は通常、動的に追加された選択肢について文句を言いますが、フォームが検証されるときにそれらがサーバー側に存在する限り、理論的には問題ありません。

于 2013-02-19T00:46:49.353 に答える