2012-06-05 33 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类保存它是有益的