7

django1.2プロジェクトの特定のクラスで「before_save」メソッドを定義しようとしています。シグナルをmodels.pyのクラスメソッドに接続するのに問題があります。

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

pre_save.connect(before_save、sender ='self')を'MyClass'自体に入れてみましたが、何も起こりません。

また、models.pyファイルの最後に配置してみました。

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

ここでシグナルをクラスメソッドに接続する方法について読みましたが、コードを理解できません。

誰かが私が間違っていることを知っていますか?

4

3 に答える 3

9

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/

于 2012-07-25T10:30:19.940 に答える
3

この質問は古いことは知っていますが、今日はこれに対する答えを探していたので、どうしてですか。コードから、実際にインスタンス メソッドを使用したかったようです (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 のオブジェクトでインスタンス メソッドを呼び出す必要がある場合に役立ちました。

于 2014-07-09T22:55:40.677 に答える
-2

Rather than use a method on MyClass, you should just use a function. Something like:

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

pre_save.connect(before_save, sender=MyClass)
于 2012-06-05T20:59:22.913 に答える