2012-09-23 16 views
15

Belki sadece geç, ama ben bu çalışmama nedenini çözemiyorum. Bir post_save sinyal görüşme bir genel işlevi varsa, bu çalışıyor, ama bir post_save sinyal çağrısı bir modelden bir yöntem varken hiçbir şey olmaz.Django sinyal çağrısı model yöntemine nasıl sahip olabilirim?

class Revision(models.Model): 
    # Model junk... 

def send_email(sender, instance, created, **kwargs): 
    if created: 
     print "DO STUFF" 

signals.post_save.connect(send_email, sender=Revision) 

Ama bu işe yaramazsa:

class Revision(models.Model): 
    # Model junk... 

    def send_email(sender, instance, created, **kwargs): 
     if created: 
      print "DO STUFF" 

signals.post_save.connect(Revision.send_email, sender=Revision) 

bir tür ruh kimin duvara kafamı çökertilmesi beni tutacak orada var mı Burada çalışan koddur? Teşekkürler.

+0

Belki yararlı: @classmethod ve @staticmethod arasında

def connect(self, receiver, sender=None, weak=True, dispatch_uid=None): """ Connect receiver to sender for signal. Arguments: receiver A function or an instance method which is to receive signals. Receivers must be hashable objects. If weak is True, then receiver must be weak-referencable (more precisely saferef.safeRef() must be able to create a reference to the receiver). Receivers must be able to accept keyword arguments. If receivers have a dispatch_uid attribute, the receiver will not be added if another receiver already exists with that dispatch_uid. 
  • Fark? [Django pre_save sinyali çalışmıyor] (http://stackoverflow.com/q/6153730/143804) –

  • +1

    En iyi uygulama tüm sinyallerinizi 'signal.py' içine koymaktır; Onları django model sınıfıyla karıştırmayın. –

    cevap

    27

    İkinci birinde sorun sınırsız bir yöntem send_mail kullandığınız olduğunu bana öyle geliyor. Eğer gerçekten bir sınıf içinden send_mail aramak isterseniz, belki @classmethod veya @staticmethod size yardımcı olacaktır:

    class Revision(models.Model): 
        # Model junk... 
    
        @classmethod 
        def send_email(cls, sender, instance, created, **kwargs): 
         if created: 
          print "DO STUFF" 
    
    signals.post_save.connect(Revision.send_email, sender=Revision) 
    

    veya

    class Revision(models.Model): 
        # Model junk... 
    
        @staticmethod 
        def send_email(sender, instance, created, **kwargs): 
         if created: 
          print "DO STUFF" 
    
    signals.post_save.connect(Revision.send_email, sender=Revision) 
    

    Alternatif bu dekoratörler kullanmadan, sen sınırlı örneği yöntemini geçirebilirsiniz:

    class Revision(models.Model): 
    # Model junk... 
    
        def send_email(self, sender, instance, created, **kwargs): 
         if created: 
          print "DO STUFF" 
    
    signals.post_save.connect(Revision().send_email, sender=Revision) 
    

    Referanslar:

    1. Django source code itibaren

      : What is the difference between @staticmethod and @classmethod in Python?

    +0

    Örnek yöntemini kullanarak üçüncü örneğiniz, burada çağrılan örnek yeni bir haktır, değil, kaydedilmiş olan örnek değil mi? Düzenleme: Oh ama 'instance' değişkeni * kaydedilen birisidir. Böyle yapmak için biraz aptalca görünüyor, ama sadece sana gösterdiğinizi görüyorum * yapabilmen için bunu yapabilirsin. Güzel. – Oli

    İlgili konular