为什么这个信号不会发射?

时间:2015-08-10 22:21:51

标签: python django

我有发布或删除前的信号我不知道该使用哪个,但我的问题是,为什么这个信号没有激活?它永远不会将文件保存在目录中。它什么也没做。

以下是代码:

@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")

知道它为什么不起作用?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您是否正在注册信号处理程序?仅使用receiver装饰器注释函数是不够的。假设您在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

<强> apps.py

from django.apps import AppConfig

class MyAwesomeAppConfig(AppConfig):
    name="my_awesome_app"

    def ready(self):
        from . import signals

<强> __初始化__。PY

default_app_config = 'my_awesome_app.apps.MyAwesomeAppConfig'

来自Django 1.8 docs

  

实际上,信号处理程序通常以信号定义   与其相关的应用程序的子模块。信号接收器是   在应用程序配置的ready()方法中连接   类。 如果您正在使用receiver()装饰器,只需导入   在ready()内发信号子模块。

修改

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