2009-09-03 248 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可能會爲你做類似的事情。