我想覆盖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)
答案 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()
。