gpt4 book ai didi

python - 未调用 Django + DjangoCMS 信号处理程序

转载 作者:行者123 更新时间:2023-11-28 22:43:24 27 4
gpt4 key购买 nike

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

我正在尝试实现这种新方法,尽管文档很少但足够简单明了,但它就是行不通。我认为 Django-CMS 或其插件之一与此有关。

我想做的是,对于保存在 pre_save 信号上的每个 MyModel,我的 CounterModel 的计数器增加 1 MyModel 模型。

我得出的结论是它不起作用,因为 increase_counter 函数中的 raise Exception('it runs') 没有被引发..

我有以下内容:

myapp/models/mymodel.py

from .counter_model import CounterModel
# Imports here

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

myapp/models/counter_model.py

# Imports here

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

myapp/signals.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/apps.py

from django.apps import AppConfig
# Other imports here

class MyAppConfig(AppConfig):
name = "myapp"

def ready(self):
import myapp.signals

myapp/__init__.py

default_app_config = 'myapp.apps.MyAppConfig'

我的 apps.py 中的 import signals 被执行,因为当我引发异常时,它会在我的控制台中引发(在 ready() 函数)。

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

顺便说一句:我还将 myapp 添加到我的 INSTALLED_APPS

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

注意对于每个认为“for 循环可能为空,打印一些东西”的人,请在我的问题开头注意以下内容:我'我们得出结论,它只是不起作用,因为 increase_counter 函数中的 raise Exception('it runs') 没有被引发..。谢谢!

最佳答案

修复 1

我通过将 signals.py 代码放入 models.py 来测试您的代码,它可以正常工作。

这是为什么?

来自 Django docs :

Where should this code live?

Strictly speaking, signal handling and registration code can live anywhere you like, although it's recommended to avoid the application's root module and its models module to minimize side-effects of importing code.

In practice, signal handlers are usually defined in a signals submodule of the application they relate to. Signal receivers are connected in the ready() method of your application configuration class. If you're using the receiver() decorator, simply import the signals submodule inside ready().

修复 2

如果您不想将signals.py 代码放入您的models.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

关于python - 未调用 Django + DjangoCMS 信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30803480/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com