Python 为什么';这不是信号火吗?

Python 为什么';这不是信号火吗?,python,django,Python,Django,我有一个用于post或pre delete的信号,我不确定使用哪个,但我的问题是,为什么这个信号不激活?它从不将文件保存在目录中。它什么也不做 代码如下: @receiver(post_delete, sender=ClientUpload) def clientupload_postdelete(sender, instance, **kwargs): filename = os.path.basename(instance.file_upload.path) client =

我有一个用于post或pre delete的信号,我不确定使用哪个,但我的问题是,为什么这个信号不激活?它从不将文件保存在目录中。它什么也不做

代码如下:

@receiver(post_delete, sender=ClientUpload)
def clientupload_postdelete(sender, instance, **kwargs):
    filename = os.path.basename(instance.file_upload.path)
    client = instance.file.client
    if instance.file_upload:
        copyfile(instance.file_upload.path, settings.MEDIA_ROOT + '/uploads/Recycle/' + client + '/' + filename)  
        logger = logging.getLogger(__name__)
        logger.info("File %s moved to %s" % (filename, settings.MEDIA_ROOT + 'uploads/Recycle/'))

        # Pass False so FileField doesn't save the model.
        instance.file_upload.delete(False)
    else:
        logger = logging.getLogger(__name__)
        logger.warning("Failed to find file %s for copying to %s." % (filename, settings.MEDIA_ROOT + '/uploads/Recycle/'))
以下是模型ClientUpload:

@python_2_unicode_compatible
class ClientUpload(models.Model):

    client = models.ForeignKey(Client)
    created_at = models.DateTimeField(auto_now_add=True)
    file_upload = models.FileField(upload_to=generate_filename)

    def __str__(self):
        return self.client.company

    class Meta:
        verbose_name_plural = _("Client Uploads")
        verbose_name = _("Client Upload")

知道它为什么不起作用吗?非常感谢您的帮助。

您正在注册信号处理程序吗?仅用
接收器
装饰器对函数进行注释是不够的。假设您在
signals.py
中定义处理程序函数,那么您将如何做到这一点:

my_awesome_project/
|-- my_awesome_app/
|   |-- __init__.py   <-- set default_app_config here
|   |-- apps.py       <-- define your AppConfig subclass here
|   |-- signals.py    <-- define your signal handling functions here
|-- other_app/
|-- my_awesome_project/
    |-- __init__.py
    |-- settings.py
    |-- wsgi.py
\uuuu init\uuuuu.py

from django.apps import AppConfig

class MyAwesomeAppConfig(AppConfig):
    name="my_awesome_app"

    def ready(self):
        from . import signals
default_app_config = 'my_awesome_app.apps.MyAwesomeAppConfig'
从:

在实践中,信号处理程序通常在信号中定义 与之相关的应用程序的子模块。信号接收器是 在应用程序配置的
ready()
方法中连接 班级如果您使用的是
receiver()
decorator,只需导入 信号子模块内部
ready()

编辑:


子类化
AppConfig
并在
ready
方法中导入单独的
signals
模块不需要使信号工作;最好的做法是避免在Django启动时多次连接同一个信号处理程序。我所展示的不是连接信号处理程序的唯一方法,但它是推荐的方法。

您可以发布用于删除
ClientUpload
对象的代码吗?我将其放在models.py中。我对你的回答有点困惑。所以在我的应用程序文件夹(与模型、视图等相同的文件夹)中,我将apps.py与该类放在一起,并将该配置行添加到同一文件夹中的init.py?我只使用接收器装饰器。在将我的信号从models.py添加到signals.py之后,我是否可以执行导入操作?我看不出这是如何注册信号处理程序的。不确定如何注册,但在我能够实现之前,它就开始工作了。没有注册或者什么的。当我从管理界面删除时,我的仪表板删除视图仍然有问题,所以我还不能在那里测试它。但是为什么它没有按照你说的那样注册就可以工作呢?@shenk是的,
apps.py
进入app文件夹,而你编辑的
\uuuuuuuuuuuuu.py
则位于该应用的根目录中。我将更新文件夹结构以显示整个项目。