7

我试图在我的 django 1.2 项目的某些类中定义一个“before_save”方法。我无法将信号连接到 models.py 中的类方法。

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

我尝试将 pre_save.connect(before_save, sender='self') 放入“MyClass”本身,但没有任何反应。

我也试过把它放在 models.py 文件的底部:

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

我在这里阅读了有关将信号连接到类方法的信息,但无法弄清楚代码。

有人知道我在做什么错吗?

4

3 回答 3

9

使用classmethod的工作示例:

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/

于 2012-07-25T10:30:19.940 回答
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"

我不确定这是否是一个好主意,但是当我需要在从类 B 保存之前调用类 A 的对象的实例方法时,它很有帮助。

于 2014-07-09T22:55:40.677 回答
-2

与其在 MyClass 上使用方法,不如只使用函数。就像是:

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

pre_save.connect(before_save, sender=MyClass)
于 2012-06-05T20:59:22.913 回答