django admin在内联线重写save方法?

django admin在内联线重写save方法?,django,django-admin,Django,Django Admin,是否有一种方法可以同时覆盖inlines窗体和父级的save方法 我想在用户保存编辑的内联表单时更改字段的值 谢谢:)一种方法是连接到内嵌模型的“pre_save”信号: from django.db.models.signals import pre_save from your_app.models import YourModel def callback(sender, **kwargs): # 'instance' is the model instance that is

是否有一种方法可以同时覆盖inlines窗体和父级的save方法

我想在用户保存编辑的内联表单时更改字段的值


谢谢:)

一种方法是连接到内嵌模型的“pre_save”信号:

from django.db.models.signals import pre_save
from your_app.models import YourModel

def callback(sender, **kwargs):
    # 'instance' is the model instance that is about to be saved,
    # so you can do whatever you want to it.
    instance.field = new_value

pre_save.connect(callback, sender=YourModel)

但是我不知道为什么不能重写
保存
方法,这几乎总是一个更好的方法。

要自定义内联线的保存,可以重写表单集

class SomeInlineFormSet(BaseInlineFormSet):
    def save_new(self, form, commit=True):
        return super(SomeInlineFormSet, self).save_new(form, commit=commit)

    def save_existing(self, form, instance, commit=True):
        return form.save(commit=commit)

class SomeInline(admin.StackedInline):
    formset = SomeInlineFormSet
    # ....
请注意,
save_new()
仅使用表单获取数据,而不允许
ModelForm
提交数据。相反,它构建模型本身。这允许它插入父关系,因为它们在表单中不存在。这就是重写
form.save()
无效的原因

对于泛型内联,从不调用
form.save()
方法,而是使用
form.cleaned\u data
获取所有值,而
字段.save\u form\u data()
用于将值存储在模型实例中



仅供参考,一些关于解决此类问题的一般提示;拥有一个IDE(或者vim配置或升华设置)非常有价值,它允许非常容易地跳转到符号定义。上面的代码是通过跳入内联/表单集代码来理解的,看看发生了什么。在PyCharm的情况下,通过按住Command(或Ctrl)并单击符号来实现。如果您是vim用户,
ctags
可能也能为您做类似的事情。

+1指出,在模型上重写
save()
方法更好!