Asi*_*nox 7 django django-admin
有没有办法同时覆盖内联表单和父级的保存方法?
我想在用户保存编辑的内联表单时更改字段的值.
谢谢 :)
若要自定义内联保存,可以覆盖FormSet
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
# ....
Run Code Online (Sandbox Code Playgroud)
注意,save_new()只使用表单来获取数据,它不会让ModelForm提交数据.相反,它构建了模型本身.这允许它插入父关系,因为它们在表单中不存在.这就是为什么覆盖form.save()不起作用的原因.
在泛型内联的情况下,form.save()永远不会调用该方法,form.cleaned_data而是使用该方法获取所有值,并Field.save_form_data()用于在模型实例中存储值.
仅供参考,一些一般提示将这些事情弄清楚; 拥有一个IDE(或者可能是vim配置或Sublime设置)非常有价值,它允许非常容易地跳转到符号定义.上面的代码是通过跳转到内联/ formset代码,并看看发生了什么来计算出来的.在PyCharm的情况下,通过按住Command(或Ctrl)并单击符号来工作.如果您是vim用户,ctags也许可以为您做类似的事情.
一种方法是连接内联模型的“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)
Run Code Online (Sandbox Code Playgroud)
但我不知道为什么你不能直接覆盖该save方法,这几乎总是一个更好的方法。
| 归档时间: |
|
| 查看次数: |
4051 次 |
| 最近记录: |