2009-09-03 89 views

回答

2

一种方法是挂接到您的联模型的`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) 

但我不知道为什么你不能只是覆盖save方法,该方法几乎总是一个更好的方法。

+0

+1为了指出最好重写Model的save()方法! – Caumons 2013-08-29 03:31:16

9

要自定义内联的储蓄,你可以重写表单集

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_data来取得所有值,而Field.save_form_data()用于存储模型实例中的值。


仅供参考,一些一般的提示推测这几样东西出来;拥有一个IDE(或者可能是vim config或Sublime setup)真的很有价值,它可以很容易地跳转到符号定义。上面的代码是通过跳转到内联/ formset代码中找出的,并查看发生了什么。在PyCharm的情况下,通过按住Command(或Ctrl)并单击该符号来工作。如果你是vim用户,ctags可能会为你做类似的事情。