【问题标题】:Catch post_save signal捕捉 post_save 信号
【发布时间】:2020-04-24 19:56:22
【问题描述】:

Django 3.0.5.

apps.py

from django.apps import AppConfig
from django.db.models.signals import post_save
from django.dispatch import receiver

class NewsConfig(AppConfig):
    name = 'news'

    def ready(self):
        from .models import News # Breakpoint 0

        @receiver(post_save, sender=News)
        def handle_news_save(sender, **kwargs):
            print("Working")
            a = 0 # Breakpoint 1

models.py

class News(models.Model):
    news_text = models.TextField()

settings.py

INSTALLED_APPS = [
     ...
    'news.apps.NewsConfig',
]

问题

当我运行应用程序时,解释器在断点 0 处停止。那是在下一行 Django 知道我正在捕捉信号。

但是当我在管理站点中保存新闻实例时,在断点 1 处,解释器并没有停止。而且,当然,不会发生打印。 你能帮我抓住信号吗?

【问题讨论】:

  • 尝试在 handle_news_save 函数中添加一个 'instance' 参数: def handle_news_save(sender, instance, **kwargs): 另外,你是否将它添加到 init.py你的应用程序? default_app_config = 'yourproject.news.apps.ProfilesConfig'
  • 亲爱的 Eduardo,您能否澄清一下,为什么我需要那里的实例?这是文档:docs.djangoproject.com/en/3.0/topics/signals/… 如您所见,给定示例中不存在任何实例。那么,如果唯一的原因可能是到达断点 0,解释器没有任何问题,我为什么需要那个 init.py?

标签: django django-signals


【解决方案1】:

好的,我试了一下,用信号玩了一下,这是我发现的:

由于问题表明这种定义方式不起作用,它似乎没有正确注册信号。我不知道为什么没有。

我想关于信号的约定无论如何都是将它们移动到 signals.py 文件中,然后在 apps.py 中只导入它们。

signals.py:

from .models import News  # Breakpoint 0
from django.db.models.signals import post_save
from django.dispatch import receiver


@receiver(post_save, sender=News)
def handle_news_save(sender, **kwargs):
    print("Working")
    a = 0  # Breakpoint 1

apps.py:

from django.apps import AppConfig
from django.db.models.signals import post_save
from django.dispatch import receiver


class PollsConfig(AppConfig):
    name = 'polls'

    def ready(self):
        import polls.signals

然后就可以了

【讨论】:

    猜你喜欢
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多