没有调用Django + DjangoCMS信号处理程序

时间:2015-06-12 12:46:32

标签: python django django-cms django-signals

因此,在Django 1.7.7中引入了一种处理信号的新方法。我正在1.7.7使用django_cms,在Python 2上运行。

我试图以这种新方式实施,尽管文档很少但很简单,但只是赢了工作。我认为Django-CMS或其中一个插件与它有关。

我尝试做的是将CounterModel的计数器增加1,保存在MyModel的{​​{1}}信号上pre_save模型。

我已经断定它不起作用,因为MyModel函数中的raise Exception('it runs')没有被提升..

我有以下内容:

的myapp /模型/ mymodel.py

increase_counter

的myapp /模型/ counter_model.py

from .counter_model import CounterModel
# Imports here

class MyModel(models.Model):
    name = models.CharField(max_length=128)
    categories = models.ManyToManyField(CounterModel)

的myapp / signals.py

# Imports here

class CounterModel(models.Model):
    amount_of_mymodels = models.PositiveIntegerField(default=0)

的myapp / apps.py

from .models.mymodel import MyModel
# Other imports here

@receiver(pre_save, sender=MyModel)
def increase_counter(sender, **kwargs):
    instance = kwargs.get('instance')
    for category in instance.categories.all():
        category.amount_of_mymodels += 1

的myapp / __初始化__。PY

from django.apps import AppConfig
# Other imports here

class MyAppConfig(AppConfig):
    name = "myapp"

    def ready(self):
        import myapp.signals

我的default_app_config = 'myapp.apps.MyAppConfig' 中的import signals已被执行,因为当我提出异常时,它会在我的控制台中(apps.py函数中)出现。

希望有人能澄清我遇到的这个问题!

BTW:我还在ready()

添加了myapp

更新:我在另一个项目(Python 3,也是Django 1.7)中尝试了新的信号方法,它运行正常。如果有人知道在我的其他项目中可能导致信号失败的原因,请告诉我!我现在要尝试对此进行调试,感谢各种形式的帮助。

注意:对于每个想' for循环可能为空的人,打印',请在我的问题开头注意以下内容:我已经断定它不起作用,因为INSTALLED_APPS函数中的raise Exception('it runs')没有被提升.. 。谢谢!

2 个答案:

答案 0 :(得分:3)

修复1

我通过将 signals.py 代码放入 models.py 来测试您的代码,然后就可以了。

为什么?

来自Django docs

  

这段代码应该在哪里生效?

     

严格地说,信号处理和注册代码可以在任何你喜欢的地方生活,尽管建议避免应用程序的根模块及其模型模块,以尽量减少导入代码的副作用。

     

实际上,信号处理程序通常定义在与其相关的应用程序的信号子模块中。信号接收器在应用程序配置类的ready()方法中连接。如果你正在使用receiver()装饰器,只需在ready()中导入信号子模块。

修复2

如果您不想在 models.py 中添加 signals.py 代码,则可以执行以下操作

class MyAppConfig(...):
   ...

    def ready(self):
        # you've to import your app's signals.py 
        # not Django's signals module
        import myapp.signals

修改

在这个问题上有一些很棒的答案和替代方案:the right place to keep my signals.py files in django

答案 1 :(得分:1)

在我的所有CMS项目中,我使用简单的import signals作为models.py中的最后一行,因为尝试在其他地方导入似乎会导致问题。我不喜欢这种方法,但我从来没有遇到任何接收信号的问题&至今尚未找到更好的解决方案。在这种情况下,我的大部分项目都是使用django 1.6和1.7进行的CMS 3版本。

这个问题考虑到它的进展有点难以理解,所以如果我错过了什么,请发表评论。