2013-02-18 12 views
6

こんにちは、私は製品を追加するためのフォームを作成した管理者パネルで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に知らせる方法です(既存の値が存在しないことについてはエラーが発生しません)。

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

+0

何か特定の理由のために、製品に、代わりのバリアントに詳細を抱き合わせていますか? –

+0

はい私はそうです。 jsでデータをフィルタリングするために使用されます。 –

答えて

2

気になる点は、Knockout.jsです。

DOMの多くの要素を同時に更新するのは非常に優れています。クライアント側のイベントからのAjax呼び出しで新しい値をカスタムビューに簡単に戻すことができます。

など、そこにこれを行うことができますいくつかのフレームワークがありますが、私はノックアウトが簡単に読み、バックボーンのような最も人気のあるものを実装し、角度、Ember社の一つであると考えて

Djangoは通常、文句を言うだろう動的に追加された選択肢がありますが、フォームが検証されるときにサーバー側に存在する限り、は理論的にはとなります。

+0

はい、インラインで新しいオブジェクトについて不平を言うことはありません。しかし、私の問題は製品に言及する必要があるので、私はまだ問題があります。私は近くにいるが、まだそこにはいない。 –

+0

あなたのように聞こえます。 – Brandon

0

私はこのアイデアを捨てることに決めました。すでに多くの時間がかかっていて、おそらくもっとかかるでしょう。また、私が思いついたのは、コーディングよりも面倒なハッキングでした。しかし、これをここにぶら下げる代わりに、私は他の人々のためのヒントを投稿します。

は、私はそれらの両方は、メインモデルの外部キーを持っており、そのうちの一つは、他の外部キーを持つ、インラインフォームセットとして2つの異なるモデルでモデルを持っています。アイデアは、ユーザーが入力した値に応じて、インラインのいずれかに偽のエントリを作成することでした。それが表現していたように、jQueryはDjangoと共に出荷されているので、かなり簡単でした。だから私はしましたが、もちろんDjangoはこのモデルが存在しないことを知っていました。解決策は私自身のフォームとフィールドを作成し、hereのようにclean()メソッドをオーバーライドすることでした。それらの多くの問題につながった

、一部は私のモデルがお互いに依存していることだったとフィールドのクリーン()メソッドは、dbオブジェクトの存在をチェックしないように少しをカットする必要がありました。それに加えて、フィールドの検証段階でPOSTデータに関する情報の不足だった、形のきれいなので、()メソッドは、ポストされたデータがあったとして上書きされなければなりませんでした。しかしそれは不潔だったので、POST dictから抽出して検証しなければならなかった。この時点で、私はそれがますます複雑になり、矛盾したデータにつながる可能性があるので、私は停止することに決めました。私は、次のステップは、作成したオブジェクトがフォームセットに縛らクエリセットにないような場所には、それを行うことができる方法上のどこかに存在しない限り、ModelAdminの方法保存オーバーライドするだろうと推測しています。私はこの時点で私はそれを行うことはないだろうと、このように言うと、データフローのよりよい制御のための私自身のchange_formビューで行かなければならない、これを要約すると

tl; dr

カスタムビューchange_formを作成します。

関連する問題