尽管已在 ready() 方法中连接,但 Django 信号接收器不起作用
Django-signal receiver doesn't work although connected in the ready() method
我是 Django 的新手,也许我的问题有一个简单的答案,但我陷入了僵局。
我的信号代码位于 signals.py
,我使用 @receiver
。根据文档,我在 apps.py
的 ready() 中导入了信号子模块。但它不起作用 =( 有人能帮我吗?
N.B。如果我在 models.py
内编写信号代码,一切正常。
代码:
signal.py
from django.db.models.signals import post_delete
from django.dispatch import receiver
import os
from .models import ProductImage
def delete_image_from_storage(path):
if os.path.isfile(path):
print(path)
os.remove(path)
@receiver(post_delete, sender=ProductImage)
def post_delete_image(sender, instance, **kawargs):
if instance.photo:
print(instance.photo.path)
delete_image_from_storage(instance.photo.path)
apps.py
from django.apps import AppConfig
class ProductsConfig(AppConfig):
name = 'products'
def ready():
import products.signals
settings.py
INSTALLED_APPS = [
...,
'products',
...,
]
As explained in the FineManual,您需要在 INSTALLED_APPS
中显式注册应用程序配置,即:
INSTALLED_APPS = [
...,
'products.apps.ProductConfig',
...,
]
或在products/__init__.py
中声明为default_app_config
:
# products/__init__.py
default_app_config = "products.apps.ProductConfig"
我是 Django 的新手,也许我的问题有一个简单的答案,但我陷入了僵局。
我的信号代码位于 signals.py
,我使用 @receiver
。根据文档,我在 apps.py
的 ready() 中导入了信号子模块。但它不起作用 =( 有人能帮我吗?
N.B。如果我在 models.py
内编写信号代码,一切正常。
代码:
signal.py
from django.db.models.signals import post_delete
from django.dispatch import receiver
import os
from .models import ProductImage
def delete_image_from_storage(path):
if os.path.isfile(path):
print(path)
os.remove(path)
@receiver(post_delete, sender=ProductImage)
def post_delete_image(sender, instance, **kawargs):
if instance.photo:
print(instance.photo.path)
delete_image_from_storage(instance.photo.path)
apps.py
from django.apps import AppConfig
class ProductsConfig(AppConfig):
name = 'products'
def ready():
import products.signals
settings.py
INSTALLED_APPS = [
...,
'products',
...,
]
As explained in the FineManual,您需要在 INSTALLED_APPS
中显式注册应用程序配置,即:
INSTALLED_APPS = [
...,
'products.apps.ProductConfig',
...,
]
或在products/__init__.py
中声明为default_app_config
:
# products/__init__.py
default_app_config = "products.apps.ProductConfig"