django admin在内联线重写save方法?
是否有一种方法可以同时覆盖inlines窗体和父级的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
谢谢:)一种方法是连接到内嵌模型的“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()
方法更好!