2012-06-05 13 views
7

Django 1.2 projemde belirli sınıflarda "before_save" yöntemini tanımlamaya çalışıyorum. Signal.py'de sinyalin sinyaline bağlanmasında sorun yaşıyorum.Django 1.2: Pre_save sinyalini sınıf yöntemine bağlama

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

Ben 'Sınıfım' kendisi, içinde pre_save.connect (before_save, gönderen = 'öz') koyarak denedim ama hiçbir şey olmuyor.

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

Sınıf yöntemlerine here sinyalleri bağlanma hakkında okumak, ama kod çözemiyorum:

Ben de models.py dosyasının altındaki koyarak denedim.

Neyi yanlış yaptığımı bilen var mı?

cevap

-2

MyClass'ta bir yöntemi kullanmak yerine, yalnızca bir işlev kullanmalısınız. Bir şey gibi:

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

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

'Lütfen don Bunu tavsiye ederim. Bir sınıf metodu kullanmanın nedeni, özellikle de yöntemin sadece sınıf ve verileri ile ilgili olması durumunda, kodu daha temiz ve daha iyi organize tutmasıdır. – Cerin

+0

Yöntem yalnızca sınıf ve verileriyle ilişkiliyse, bunun yerine kaydetme yöntemini aşmanın daha iyi olduğunu düşünüyorum. –

7

Bir çalışma örneği classmethod ile:

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) 

Orada otomatik sinyal bağlantılarını işlemek için büyük bir dekoratör de var: Ben bu soruyu eski olduğunu biliyorum http://djangosnippets.org/snippets/2124/

3

ama bugün erken bir cevap arıyordu, neden olmasın. Kodunuzdan aslında bir örnek yöntemi kullanmak istediniz (self ve alan ataması). DataGreed, bir sınıf yöntemi için nasıl kullanılacağını ele aldı ve örnek yöntemlerle sinyalleri kullanmak oldukça benzer.

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" 

bunun iyi bir fikir olup olmadığını emin değilim, ama sınıf B'den kaydetmeden önce ben sınıf A bir nesne üzerinde adlandırılan bir örnek yöntemi gerektiğinde yararlı oldu