调试Django信号处理器

0 投票
2 回答
556 浏览
提问于 2025-06-18 04:02

我第一次尝试使用信号。 我有一个模型,叫做 UserAlias,我想在创建 UserAlias 记录后执行一些代码。

UserAlias 定义在 aliases/models.py 文件中。我创建了一个 aliases/signals/handlers.py 文件。这个文件的内容如下:

from django.db.models.signals import post_save, post_init, post_delete
from django.dispatch import receiver
from aliases.models import UserAlias

@receiver(post_init, sender=UserAlias)
def post_init_handler(sender, **kwargs):
    print('hello there from a signal')

@receiver(post_save, sender=UserAlias)
def post_save_handler(sender, **kwargs):
    print('hello there from a signal')

@receiver(post_delete, sender=UserAlias)
def post_delete_handler(sender, **kwargs):
    print('hello there from a signal')

但是当我执行:

from aliases.models import *
newalias = UserAlias.objects.create(...omitted...)

我没有看到我的调试 print 语句被执行。 我这里缺少了什么呢?

更新:

我把我的 post_init_handlerpost_save_handlerpost_delete_handler 的定义移动到了 aliases/models.py 文件中,放在 UserAlias 类的声明之后。

另外,我的 post_init_handler 现在看起来是这样的:

@receiver(post_init, sender=UserAlias)
def post_init_handler(sender, instance, **kwargs):
    print(f'hello there from a signal {sender} {instance}')

我尝试按照 Paaksing 的建议声明它……

@receiver(post_init, sender=UserAlias)
def post_init_handler(sender, instance, created, **kwargs):
    print(f'hello there from a signal {created} {sender} {instance}')

但是我得到了这个错误:

TypeError: post_init_handler() missing 1 required positional argument: 'created'

更新 II:

post_init 处理器没有 created 参数。 created 参数是和 post_save 处理器一起用的。像这样:

@receiver(post_save, sender=UserAlias)
def post_save_handler(sender, instance, created, **kwargs):
    if created:
        print(f'hello from post_save_handler( {sender}, {instance}, {created})')

相关问题:

  • 暂无相关问题
暂无标签

2 个回答

0

你在一个单独的模块里创建了信号(这很好)。不过,你还需要在正确的位置导入这个模块,才能使用这些信号。

Django的文档建议把信号放在你的应用配置文件里。你可以像这样做。

from django.apps import AppConfig


class MyAppConfig(AppConfig):
    name = 'myproject.app'

    def ready(self) -> None:
        import myproject.app.aliases/signals/handlers  # noqa
2

你漏掉了一个 created 属性。

如果你在处理像用户一样的模型,建议添加 instance,这样你就可以在信号中对它们进行操作。

@receiver(post_save, sender=UserAlias)
def post_save_handler(sender, instance, created, **kwargs):
    if created:
        print('hello there from a signal')

更新:正如 Red Cricket 所说,post_init 没有 created 实例,但在 post_save 中按预期工作。

在 Django 的文档中,你可以看到可以与每个信号一起使用的所有实例:https://docs.djangoproject.com/en/3.0/ref/signals/

撰写回答