因此,在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')
没有被提升.. 。谢谢!
答案 0 :(得分:3)
我通过将 signals.py 代码放入 models.py 来测试您的代码,然后就可以了。
为什么?
来自Django docs:
这段代码应该在哪里生效?
严格地说,信号处理和注册代码可以在任何你喜欢的地方生活,尽管建议避免应用程序的根模块及其模型模块,以尽量减少导入代码的副作用。
实际上,信号处理程序通常定义在与其相关的应用程序的信号子模块中。信号接收器在应用程序配置类的ready()方法中连接。如果你正在使用receiver()装饰器,只需在ready()中导入信号子模块。
如果您不想在 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版本。
这个问题考虑到它的进展有点难以理解,所以如果我错过了什么,请发表评论。