2012-01-26 5 views
0

モデルフォームのsave()関数をオーバーライドして、ユーザーが特定の送信ボタンを押したときにモデルのフィールドを更新したいとします。また、他のフィールドを調べて値を更新したいのですが、これをModelAdminのsave_model()関数で行っています。ただし、save_model()関数はオブジェクトにNoneを渡しています。フォームのsave()関数をコメントアウトすると、save_model()関数が期待通りに機能します。ModelAdmin.save_model()とModelForm.save()の両方をオーバーライドする際の問題

両方を無効にすることに問題がありますか、どこかで間違いを犯しましたか?ここで

は、最小限の例です:

admin.py:

class TestAdmin(admin.ModelAdmin): 
    form = TestForm 
    def save_model(self, request, obj, form, change): 
     print 'test' 
     super(PostAdmin, self).save_model(request, obj, form, change) 

admin.site.register(TestModel, TestAdmin) 

がforms.py:

class TestForm(forms.ModelForm): 
    class Meta: 
     model = TestModel 
    def save(self, force_insert=False, force_update=False, commit=True): 
     print 'test' 
     super(TestForm, self).save(commit=True) 
+0

最後の行でCategoryFormではなくTestFormを読みますか? – akonsu

+0

ああ、良いキャッチ - 私は質問を編集した – Pikaling

答えて

2

ModelFormはインスタンスを返す必要があります。

私が覚えている限り、save_modelの直前に、管理者はsave(commit=False)を実行し、未保存のインスタンスをsave_modelに渡します。何も返さなければ、save() == None

return super(CategoryForm, self).save(commit=True) 
+0

ああありがとう、私はそれがインスタンスを返す必要があることを認識していない – Pikaling

0

あなたがModelAdmin.save_modelをオーバーライドし、(自分の中でsuper().save_modelを呼び出していない場合例があります)、明示的にform.save()を呼び出す必要があります。

ModelForm.saveを何とか呼び出す場合は、スーパーコールまたは明示的な呼び出しによって、なぜ機能しないのかわかりません。 save_modelを無効にすると、私の好みはModel.save()を上書きすることになります。

関連する問題