70

だから私はDjangoのソースコード(ポスト1.5)を読んで、複数のシグナルをレシーバー関数に登録できるようになりました:

def receiver(signal, **kwargs):
    """
    A decorator for connecting receivers to signals. Used by passing in the
    signal (or list of signals) and keyword arguments to connect::

        @receiver(post_save, sender=MyModel)
        def signal_receiver(sender, **kwargs):
            ...

        @receiver([post_save, post_delete], sender=MyModel)
        def signals_receiver(sender, **kwargs):
            ...

    """
    ... implementation code...

ただし、異なる送信者からの複数の post_save シグナルを同じ関数に登録したいと考えています。今、私は電話するだけです

post_save.connect(fn_name, model_name)

私が持っている各モデルについて。新しい Django 1.5 @receiver デコレータ機能でこれを行うより良い方法はありますか?

4

4 に答える 4

203

@receiverデコレータを使用してそれを行うことができます:

from django.dispatch import receiver

@receiver(post_save, sender=Model1)
@receiver(post_save, sender=Model2)
@receiver(post_save, sender=Model3)
def my_signal_handle(sender , **kwargs)
    # some code here
于 2015-08-26T15:37:26.087 に答える
38

レシーバーに関する Django のドキュメントによると、レシーバーはデフォルトで特定のセンダーに接続する必要はありません。したがって、あなたが説明しているのはデフォルトの Django 機能です。

つまり、@receiverデコレータを使用してこれを行うには、デコレータで送信者を指定しないだけです。例えば:

@receiver(post_save) # instead of @receiver(post_save, sender=Rebel)
def set_winner(sender, instance=None, created=False, **kwargs):
    list_of_models = ('Rebel', 'Stormtrooper', 'Battleground')
    if sender.__name__ in list_of_models: # this is the dynamic part you want
        if created: # only run when object is first created
            ... set the winner ...

これは、次のようなモデルを想定しています。

class Rebel(models.Model):
    ...

class Stormtrooper(models.Model):
    ...

class Battleground(models.Model):
    ...
于 2013-09-12T07:00:44.173 に答える