【问题标题】:Trouble overriding both ModelAdmin.save_model() and ModelForm.save()无法同时覆盖 ModelAdmin.save_model() 和 ModelForm.save()
【发布时间】:2012-01-26 23:03:02
【问题描述】:

我想覆盖 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)

【问题讨论】:

  • 最后一行应该是 TestForm 而不是 CategoryForm 吗?
  • 啊,很好 - 我已经编辑了问题

标签: django


【解决方案1】:

您的ModelForm 需要返回实例。

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

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

【讨论】:

    【解决方案2】:

    如果您覆盖ModelAdmin.save_model,而不是调用super().save_model(在您的示例中,我可以看到。),您应该显式调用form.save()

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多