2011-07-22 7 views
8

Djangoではorder_with_respect_toのモデルにcan_order = Trueのインラインフォームセットを使用しています。フロントエンドでドラッグアンドドロップを設定しました。これにより、Djangoの自動生成されたORDERフォームフィールド(私は隠していました)が新しい順序を反映して変更されます。私は新しい注文をサーバーに正しくポストしていることを確認しましたが、Djangoはそれを無視して元の順序でモデルを保存しています。自動的に作成されたデータベースの_orderフィールドは変更されません。Djangoインラインフォームセットの注文をどのように保存しますか?

formsetで指定された注文を使用してモデルを保存するにはどうすればよいですか?フォームセットでsave()と呼ぶ以外の特別なことが必要ですか?

答えて

2

私は同じ問題を抱えていました.Djangoソースを掘り下げた後、あなた自身で行う必要があると考えました。あなたは、この順序を設定しない見つけたとして、しかし

services = service_formset.save(commit=False) 
for service in services: 
    # ... do something with m2m relationships ... 
    service.save() 

私の最初の実装は、このようなものを見ました。代わりに私の実装は次のようになります:

for form in service_formset: 
    service = form.save(commit=False) 
    # ... do something with m2m relationships ... 
    service.order_order = form.cleaned_data['ORDER'] 
    service.save() 

上記の「order_order」は、私のモデルの注文を追跡するために使用しているフィールドです。

また、モデルのメタクラスの 'ordering'属性を指定して、formsetを再度生成するときに要素が正しい順序になるようにする必要があることに注意してください。

class Service(models.Model): 
    # ... 
    order_order = models.IntegerField(default=0) 
    class Meta: 
     ordering = ['order_order',] 
4

提案されている解決策は、can_delete = Trueと一緒には機能しません。ここで

もcan_delete =真で動作します私のソリューションです:

for instance in formset.save(commit=False): 
    # ... do something with m2m relationships ... 
for form in formset.ordered_forms: 
    form.instance.order = form.cleaned_data['ORDER'] 
    form.instance.save() 
+2

あなたは 'order_with_respect_to'プロパティを使用している場合、あなたはまた' set_RELATED_order()の順序を設定するために 'メソッドを使用することができます。私はそのようなsmthを使用します: 'step.set_stepmaterial_order([self.formset.ordered_formsのフォームのためのform.instance.pk)' –

関連する問題