2012-06-05 72 views
7

我想在我的django 1.2項目的某些類中定義一個「before_save」方法。我無法將信號連接到models.py中的類方法。Django 1.2:如何將pre_save信號連接到類方法

class MyClass(models.Model): 
    .... 
    def before_save(self, sender, instance, *args, **kwargs): 
     self.test_field = "It worked" 

我試着在'MyClass'本身放置pre_save.connect(before_save,sender ='self'),但沒有任何反應。

我也試着將它放在models.py文件的底部:

pre_save.connect(MyClass.before_save, sender=MyClass) 

我讀到信號連接到類方法here,但想不通的代碼。

有人知道我在做什麼錯嗎?

回答

-2

而不是在MyClass上使用方法,你應該只使用一個函數。喜歡的東西:

def before_save(sender, instance, *args, **kwargs): 
    instance.test_field = "It worked" 

pre_save.connect(before_save, sender=MyClass) 
+3

請不要」 t推薦這個。使用類方法的原因是它使代碼更加清潔和更好地組織,特別是如果方法只涉及類及其數據。 – Cerin

+0

如果該方法只涉及類和它的數據,我認爲最好是使用保存方法。 –

7

工作示例與類方法

class MyClass(models.Model): 
    #.... 
    @classmethod 
    def before_save(cls, sender, instance, *args, **kwargs): 
     instance.test_field = "It worked" 

pre_save.connect(MyClass.before_save, sender=MyClass) 

還有一個很大的裝飾來自動處理信號連接:http://djangosnippets.org/snippets/2124/

3

我知道這個問題是老了,但我正在尋找今天早些時候的答案,爲什麼不呢。從您的代碼看來,您實際上想要使用實例方法(來自self和字段分配)。 DataGreed解決了如何將它用於類方法,並且使用實例方法的信號非常相似。

class MyClass(models.Model) 

    test_field = models.Charfield(max_length=100) 

    def __init__(self, *args, **kwargs): 
     super(MyClass, self).__init__(*args, **kwargs) 
     pre_save.connect(self.before_save, sender=MyClass) 

    def before_save(self, sender, instance, *args, **kwargs): 
     self.test_field = "It worked" 

我不知道這是否是一個好主意或沒有,但我需要調用的類A的對象上的實例方法之前,從B類保存它是有益的