2016-01-22 56 views
2

这里是在model Document的pre_delete上运行的东西。按照建议的最佳做法,将这些代码放在单独的文件(signals.py)中时会被忽略。当放在模型文件中时,它工作正常。Django pre_delete信号被忽略

from django.db.models.signals import pre_delete, pre_save 
from django.dispatch import receiver 
from _myTools.functions import ImageProcessing 
from content_image.models import Document 
import os 

# Image deletion when deleting entire entry 
@receiver(pre_delete, sender=Document, dispatch_uid='document_delete_signal') 
def entry_deletion_images_delete(sender, instance, using, **kwargs): 
    for key, value in instance.imageSizes.items(): 
     name_of_image_field = str(getattr(instance, key)) # Converts to string, if not is object itself 
     os.remove(instance.baseDir + name_of_image_field) 
     setattr(instance, key, None) 

那么这是什么问题?我应该在那里输入更多东西吗?或者我应该将该文件导入某处?

回答

1

问题是,如果你把它放在signals.py(推荐),但什么也不做,那么没有人会导入该文件。

您应该按照this advice,特别是

在实践中,信号处理程序是在它们与该应用程序的一个子模块的信号通常定义。信号接收器连接在应用程序配置类的ready()方法中。如果使用receiver()装饰器,只需在ready()内导入信号子模块。

ready()是负责导入模块,从而引发信号“连接”,并允许信号接收器工作。


完整的程序应该是:

# my_app/__init__.py 

default_app_config = 'my_app.apps.ConfigForMyApp' 

和apps.py应该是:

# my_app/apps.py 

from django.apps import AppConfig 

class ConfigForMyApp(AppConfig): 
    # Optionally add `name` and `verbose_name` 
    # for the app 
    def ready(self): # overriding the ready method 
     # This will trigger the @receiver decorator 
     # and thus connect the signals 
     import my_app.signals 
+0

感谢它的工作。这是否值得额外的复杂性?把它放在模型中有什么不对吗? –

+0

取决于您计划发展您的应用程序的多少。如果它不会增长,那么把它放在'models'中。如果你打算重新分配它,使用一堆迁移的东西,一些奇怪的连接,添加单元测试等,那么它可能是值得的,因为你可能会避免一些错误,代码会更干净整齐。 – MariusSiuram

+0

谢谢,如果我希望它是系统范围(不涉及特定的应用程序),我应该把它们不在app目录中,但在项目apps.py和__init__? –

2

虽然由MariusSiuram提供的答案是对的Django> =新的推荐方式1.7,这里是另一种模式,它可以工作,不管django的版本如何:

在你的mo dels.py文件:

from django.db.models.signals import pre_delete 
from myapp.signals import pre_delete_signal_dispatcher 

pre_delete.connect(pre_delete_signal_dispatcher, sender=MyModel, dispatch_uid="delete_signal_dispatch") 

这样,信号连接时models.py文件解析,并触发pre_delete事件,你可以继续增长您的signals.py文件。但是,是的,如果信号连接的数量增加,在应用配置中管理它们更容易。

+0

这也期望删除'@收到'装饰器,不是吗?它的确提供了更干净的代码,尽管模型加载时信号连接的潜在问题可能仍然是一个问题。但是,+1 :) – MariusSiuram