Django - 信号。简单的例子开始

时间:2015-01-06 17:08:09

标签: python django django-signals

我是Django的新手,我无法理解如何使用Django信号。任何人都可以用简单的例子解释“ Django信号”吗?

提前致谢。

3 个答案:

答案 0 :(得分:28)

通过非常小的研究,您可以在互联网上找到关于django信号的非常好的内容。

在这里,我将向您简要介绍一下Django信号 什么是Django信号?
信号允许某些发送者通知一组接收者已经发生了某些动作

行动:

调用

模型的save()方法。
django.db.models.signals.pre_save | post_save

调用

模型的delete()方法。
django.db.models.signals.pre_delete | post_delete

模型上的ManyToManyField已更改。
django.db.models.signals.m2m_changed

Django启动或完成HTTP请求。
django.core.signals.request_started | request_finished

所有信号都是django.dispatch.Signal实例。

非常基本的例子:

models.py

from django.db import models
from django.db.models import signals

def create_customer(sender, instance, created, **kwargs):
    print "Save is called"

class Customer(models.Model):
    name = models.CharField(max_length=16)
    description = models.CharField(max_length=32)

signals.post_save.connect(receiver=create_customer, sender=Customer)

外壳

In [1]: obj = Customer(name='foo', description='foo in detail')

In [2]: obj.save()
Save is called

答案 1 :(得分:14)

除了Prashant给出的解释外,您还可以使用django.dispatch模块中的 receiver 装饰器。

e.g。

from django.db import models
from django.db.models import signals
from django.dispatch import receiver

class Customer(models.Model):
    name = models.CharField(max_length=16)
    description = models.CharField(max_length=32)

@receiver(signals.pre_save, sender=Customer)
def create_customer(sender, instance, created, **kwargs):
    print "customer created"

有关详细信息,请参阅此link

答案 2 :(得分:0)

在signals.post_save.connect(receiver = create_customer,sender = Customer)...中,发件人永远是我们正在定义的模型...或者我们也可以在发件人中使用用户。