2011-02-15 49 views
1
def pre_save(self, model_instance, add): 
     value = super(MediaUploadField, self).pre_save(model_instance, add) 
     if value and add: 
      post_save.connect(self.someCallback, sender=model_instance.__class__, dispatch_uid='media_attachment_signal') 
     return value 

    def someCallback(sender, **kwargs): 
     print "callback" 
     print sender 
     return 

信号多值抛出以下错误:Django的 - 关键字参数“发件人”

someCallback() got multiple values for keyword argument 'sender' 

老实说,我不知道是什么我做错了,我跟着文档精确。我试着替换model_instance。 与实际的类导入,但它会引发相同的错误。

是否有任何想法是什么错我的代码?

回答

4

看来someCallback是一种模型方法。模型方法的第一个参数始终是实例本身 - 通常引用为self。但是你已经调用了第一个参数sender - 所以Python试图接收sender作为第一个位置参数,并作为关键字参数之一。

来解决它的最好方法是定义someCallback作为一个静态方法,因为这些不采取实例或类:

@staticmethod 
def someCallback(sender, **kwargs): 

还要注意的是,在一个pre_save方法连接你的post_save处理器是一个非常奇怪的事情要做。不要忘记,连接一个信号是一个永久的事情 - 这不是每个呼叫的基础上完成的。

+0

是的,我知道这是一件很奇怪的事情。我试图创建一个'附件',当用户添加一些媒体到一个对象时,但显然我不能这样做,直到模型被保存。由于我想保留独立创建附件的应用程序,因此我无法使用其他模型保存方法或以这种方式附加信号。不过谢谢,我没有注意到这一点,我感到很蠢。 – Hanpan 2011-02-15 10:14:47