无法覆盖ModelAdmin.save_model()和ModelForm.save()

时间:2012-01-26 23:03:03

标签: django

我想覆盖ModelForm的save()函数,以便在用户按下特定的提交按钮时更新模型上的字段。我还想检查一些其他字段并更新它们的值,我已经在ModelAdmin的save_model()函数中完成了这个。但是,save_model()函数正在为该对象传递None。如果我注释掉表单的save()函数,那么save_model()函数将按预期工作。

是否存在覆盖两者的问题,或者我在某处犯了错误?

这是一个最小的例子:

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)

2 个答案:

答案 0 :(得分:2)

您的ModelForm需要返回实例。

据我记得,在save_model之前,管理员执行save(commit=False)并将未保存的实例传递给save_model。如果您没有返回任何内容,save() == None

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

答案 1 :(得分:0)

如果你要覆盖ModelAdmin.save_model,而不是调用super().save_model(在你的例子中,我可以看到。),你应该明确地调用form.save()

如果你通过超级或明确的呼叫以某种方式呼叫ModelForm.save,我不明白为什么它不起作用;但我可以告诉你,如果我要覆盖save_model,我的偏好就是限制自己覆盖Model.save()