2012-06-05 6 views
7

私のdjango 1.2プロジェクトの特定のクラスで "before_save"メソッドを定義しようとしています。 models.pyのクラスメソッドにシグナルを接続するのに問題があります。Django 1.2:pre_save信号をクラスメソッドに接続する方法

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

メソッドがクラスとそのデータにのみ関係する場合は、代わりにメソッドを保存する方が良いと思います。 –

3

、しかし:

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) 

あり、自動的に信号の接続を処理するのに最適なデコレータもあります今日のこれまでの答えを探していたので、なぜそうはしませんか。あなたのコードからは、実際にインスタンスメソッド(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のオブジェクトで呼び出さインスタンスメソッドを必要なときには参考になりました

関連する問題