2012-06-05 18 views
7

पर pre_save सिग्नल को कैसे कनेक्ट करें मैं अपने django 1.2 प्रोजेक्ट में कुछ कक्षाओं में "first_save" विधि को परिभाषित करने का प्रयास कर रहा हूं। मुझे models.py में क्लास विधि में सिग्नल को जोड़ने में समस्या हो रही है।Django 1.2: कक्षा विधि

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

मैं 'MyClass' ही है, में pre_save.connect (before_save, इस = 'स्वयं') डालने की कोशिश की है, लेकिन कुछ नहीं होता।

मैं भी models.py फ़ाइल के तल पर डालने की कोशिश की है:

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

मैं कक्षा तरीकों here को संकेत जोड़ने के बारे में पढ़ा है, लेकिन कोड को समझ नहीं सकता।

कोई भी जानता है कि मैं क्या गलत कर रहा हूं?

उत्तर

-2

MyClass पर एक विधि का उपयोग करने के बजाय, आपको केवल एक फ़ंक्शन का उपयोग करना चाहिए। कुछ की तरह:

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

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

कृपया डॉन ' टी इसकी सिफारिश नहीं है। कक्षा विधि का उपयोग करने का कारण यह है कि यह कोड को अधिक स्वच्छ और बेहतर व्यवस्थित रखता है, खासकर यदि विधि केवल कक्षा और उसके डेटा से संबंधित है। – Cerin

+0

यदि विधि केवल कक्षा और उसके डेटा से संबंधित है, तो मुझे लगता है कि इसके बजाय सवारी बचाने की विधि पर बेहतर होना बेहतर है। –

7

के साथ एक काम कर उदाहरण 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/

3

मैं जानता हूँ कि इस सवाल पुराना है, लेकिन मुझे लगता है आज पहले इसका जवाब ढूंढ रहा था तो क्यों नहीं। ऐसा लगता है कि आप वास्तव में एक उदाहरण विधि का उपयोग करना चाहते थे (self और फ़ील्ड असाइनमेंट से)। डेटाग्रेड ने क्लास विधि के लिए इसका उपयोग कैसे किया, और उदाहरण विधियों के साथ सिग्नल का उपयोग करना काफी समान है।

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" 

मैं अगर यह एक अच्छा विचार है या नहीं यकीन नहीं है, लेकिन जब मैं कक्षा एक की एक वस्तु पर बुलाया एक उदाहरण विधि की जरूरत से पहले वर्ग बी से बचाने के लिए यह मददगार था