我正在尝试在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,但无法弄清楚代码。
有人知道我做错了吗?
答案 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)