Django 1.2:如何将pre_save信号连接到类方法

时间:2012-06-05 20:55:35

标签: python django signals python-2.7 django-1.2

我正在尝试在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)

我读到了将信号连接到类方法here,但无法弄清楚代码。

有人知道我做错了吗?

3 个答案:

答案 0 :(得分:8)

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/

答案 1 :(得分: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类对象的实例方法时,这很有用。

答案 2 :(得分:-2)

您应该只使用一个函数,而不是在MyClass上使用方法。类似的东西:

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

pre_save.connect(before_save, sender=MyClass)