Django发送的所有信号的列表。 所有内置信号都使用send()
方法发送。
请参见
有关如何注册和接收信号的信息,请参阅signal dispatcher上的文档。
当用户登录/退出时,authentication framework发送signals when a user is logged in / out
django.db.models.signals
模块定义了模型系统发送的一组信号。
警告
这些信号中的许多通过诸如__init__()
或save()
的各种模型方法发送,您可以在自己的代码中覆盖。
如果您在模型上覆盖这些方法,则必须调用父类的方法来发送此信号。
还要注意,Django默认将信号处理程序存储为弱引用,所以如果你的处理程序是本地函数,那么可能是垃圾回收。 为了防止这种情况,请在调用信号的connect()
时传递weak=False
。
注
通过指定其完整的应用程序标签连接接收机时,模型信号sender
可以被延迟引用。 例如,polls
应用程序中定义的Answer
模型可以被引用为'polls.Answer'
。 在处理循环导入依赖和可交换模型时,这种引用可以非常方便。
pre_init
¶django.db.models.signals.
pre_init
¶每当您实例化Django模型时,该信号都会在模型的__init__()
方法的开头发送。
带有此信号的参数:
sender
args
__init__()
的位置参数列表:kwargs
__init__()
的关键字参数的字典:例如,tutorial具有以下一行:
p = Poll(question="What's up?", pub_date=datetime.now())
发送到pre_init
处理程序的参数将是:
参数 | 值 |
---|---|
sender |
Poll (类本身) |
args |
[] (一个空列表,因为没有位置参数传递给__init__() 。) |
kwargs |
{'question': "What's up?", 'PUB_DATE': datetime.now()} |
post_init
¶django.db.models.signals.
post_init
¶像pre_init一样,但是当__init__()
方法完成时,就会发送这个。
带有此信号的参数:
sender
instance
pre_save
¶django.db.models.signals.
pre_save
¶这是在模型的save()
方法的开头发送的。
带有此信号的参数:
sender
instance
raw
True
如果模型按照显示的方式保存(即当加载固定装置时)。 不应该查询/修改数据库中的其他记录,因为数据库可能尚未处于一致状态。using
update_fields
Model.save()
, or None
if update_fields
wasn’t passed to save()
.post_save
¶django.db.models.signals.
post_save
¶带有此信号的参数:
sender
instance
created
True
如果创建了新记录。raw
True
如果模型按照显示的方式保存(即当加载固定装置时)。 不应该查询/修改数据库中的其他记录,因为数据库可能尚未处于一致状态。using
update_fields
Model.save()
, or None
if update_fields
wasn’t passed to save()
.pre_delete
¶django.db.models.signals.
pre_delete
¶在模型的delete()
方法和queryset的delete()
方法的开头发送。
带有此信号的参数:
sender
instance
using
post_delete
¶django.db.models.signals.
post_delete
¶像pre_delete
一样,但是在模型的delete()
方法和queryset的delete()
方法的末尾发送。
带有此信号的参数:
sender
instance
正在删除的实际实例。
请注意,该对象将不再位于数据库中,所以要非常小心使用此实例。
using
m2m_changed
¶django.db.models.signals.
m2m_changed
¶在模型实例上更改了ManyToManyField
时发送。 严格来说,这不是一个模型信号,因为它是由ManyToManyField
发送的,但由于它补充了pre_save
/ post_save
和pre_delete
/ post_delete
当跟踪模型的更改时,它包括在这里。
带有此信号的参数:
sender
ManyToManyField
的中间模型类。 当定义多对多字段时,此类自动创建;您可以使用多对多字段上的through
属性访问它。instance
sender
或ManyToManyField
相关的类的一个实例。action
指示在关系上完成的更新类型的字符串。 这可以是以下之一:
“pre_add”
“post_add”
“pre_remove”
“post_remove”
“pre_clear”
“post_clear”
reverse
model
pk_set
对于pre_add
,post_add
,pre_remove
和post_remove
操作,这是一组主键值加入或从关系中删除。
对于pre_clear
和post_clear
操作,这是None
。
using
例如,如果Pizza
可以有多个Topping
对象,建模如下:
class Topping(models.Model):
# ...
pass
class Pizza(models.Model):
# ...
toppings = models.ManyToManyField(Topping)
如果我们连接一个这样的处理程序:
from django.db.models.signals import m2m_changed
def toppings_changed(sender, **kwargs):
# Do something
pass
m2m_changed.connect(toppings_changed, sender=Pizza.toppings.through)
然后做了这样的事情:
>>> p = Pizza.objects.create(...)
>>> t = Topping.objects.create(...)
>>> p.toppings.add(t)
发送到上面示例中的m2m_changed
处理程序(toppings_changed
)的参数将是:
参数 | 值 |
---|---|
sender |
Pizza.toppings.through (中间m2m类) |
instance |
p (正在修改的Pizza 实例) |
action |
"pre_add" (后接单独的信号,具有"post_add" ) |
reverse |
False (Pizza 包含ManyToManyField ,因此此调用修改向前关系) |
model |
Topping (添加到Pizza 中的对象的类) |
pk_set |
{t.id} (因为只有Topping t 被添加到关系中) |
using |
"default" (由于默认路由器在此发送写入) |
如果我们会这样做:
>>> t.pizza_set.remove(p)
发送到m2m_changed
处理程序的参数将是:
参数 | 值 |
---|---|
sender |
Pizza.toppings.through (中间m2m类) |
instance |
t (正在修改的Topping 实例) |
action |
"pre_remove" (后跟一个单独的信号与"post_remove" ) |
reverse |
True (Pizza 包含ManyToManyField ,因此此调用会修改反向关系) |
model |
Pizza (从Topping 中删除的对象的类) |
pk_set |
{p.id} (因为只有比萨 p 从关系中删除) |
using |
"default" (由于默认路由器在此发送写入) |
class_prepared
¶django.db.models.signals.
class_prepared
¶每当模型类“准备”时发送 - 即,一旦模型已经被定义并在Django的模型系统中注册。 Django内部使用这个信号;它通常不会用于第三方应用程序。
由于此信号是在应用程序注册表群集进程期间发送的,并且在应用注册表完全填充后运行AppConfig.ready()
,因此无法使用该方法连接接收器。
一种可能性是连接他们AppConfig.__init__()
,注意不要导入模型或触发对应用程序注册表的调用。
使用此信号发送的参数:
sender
pre_migrate
¶django.db.models.signals.
pre_migrate
¶在开始安装应用程序之前,由migrate
命令发送。 对于缺少models
模块的应用,不会发送。
带有此信号的参数:
sender
AppConfig
实例。APP_CONFIG
sender
相同。verbosity
指示manage.py在屏幕上打印多少信息。 有关详细信息,请参阅--verbosity
标志。
监听pre_migrate
的函数应根据该参数的值调整输出到屏幕的内容。
interactive
如果interactive
是True
,则可以安全地提示用户在命令行中输入内容。 如果interactive
为False
,则侦听此信号的功能不应尝试提示任何内容。
例如,当interactive
为True
时,django.contrib.auth
应用程序仅提示创建超级用户。
using
plan
迁移计划将用于迁移运行。 虽然该计划不是公共API,但这在允许罕见的情况下需要知道计划。 一个计划是两个元组的列表,第一个项目是迁移类的实例,第二个项目显示迁移是否回滚(True
)或应用(False
apps
post_migrate
¶django.db.models.signals.
post_migrate
¶在migrate
(即使不进行迁移)和flush
命令的末尾发送。 对于缺少models
模块的应用,不会发送。
此信号的处理程序不得执行数据库模式更改,因为如果在migrate
命令期间运行,则可能会导致flush
命令失败。
带有此信号的参数:
sender
AppConfig
实例。APP_CONFIG
sender
相同。verbosity
指示manage.py在屏幕上打印多少信息。 有关详细信息,请参阅--verbosity
标志。
监听post_migrate
的函数应根据此参数的值调整输出到屏幕的内容。
interactive
如果interactive
是True
,则可以安全地提示用户在命令行中输入内容。 如果interactive
为False
,则侦听此信号的功能不应尝试提示任何内容。
例如,当interactive
为True
时,django.contrib.auth
应用程序仅提示创建超级用户。
using
default
数据库。plan
用于迁移运行的迁移计划。 虽然该计划不是公共API,但这在允许罕见的情况下需要知道计划。 一个计划是两个元组的列表,第一个项目是迁移类的实例,第二个项目显示迁移是否回滚(True
)或应用(False
apps
例如,您可以在AppConfig
中注册回调,如下所示:
from django.apps import AppConfig
from django.db.models.signals import post_migrate
def my_callback(sender, **kwargs):
# Your specific logic here
pass
class MyAppConfig(AppConfig):
...
def ready(self):
post_migrate.connect(my_callback, sender=self)
注
如果您提供AppConfig
实例作为发件人参数,请确保信号已在ready()
中注册。 AppConfig
s are recreated for
tests that run with a modified set of INSTALLED_APPS
(such as
when settings are overridden) and such signals should be connected for each
new AppConfig
instance.
处理请求时由核心框架发送的信号。
request_started
¶django.core.signals。
request_started T0> ¶ T1>
当Django开始处理HTTP请求时发送。
带有此信号的参数:
sender
django.core.handlers.wsgi.WsgiHandler
- 处理该请求。ENVIRON
environ
字典提供给请求。request_finished
¶django.core.signals.
request_finished
¶当Django完成向客户端传递HTTP响应时发送。
带有此信号的参数:
sender
got_request_exception
¶django.core.signals。
got_request_exception T0> ¶ T1>
当Django在处理传入的HTTP请求时遇到异常时,会发送此信号。
带有此信号的参数:
sender
request
HttpRequest
对象。信号只在running tests时发送。
setting_changed
¶django.test.signals.
setting_changed
¶当通过django.test.TestCase.settings()
上下文管理器或django.test.override_settings()
装饰器/上下文管理器
实际发送两次:应用新值(“setup”)和恢复原始值(“拆除”)时。 使用enter
参数来区分两者。
您还可以从django.core.signals
导入此信号,以避免在非测试情况下从django.test
导入。
带有此信号的参数:
sender
setting
value
value
为None
。enter
True
如果应用设置,False
如果还原。2017年9月6日