为什么这个信号不发射?

2024-04-25 04:25:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个信号用于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")

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


Tags: topathinstancenameclientsettingsmodelsroot
1条回答
网友
1楼 · 发布于 2024-04-25 04:25:49

你在注册信号处理程序吗?仅仅用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

应用程序.py

from django.apps import AppConfig

class MyAwesomeAppConfig(AppConfig):
    name="my_awesome_app"

    def ready(self):
        from . import signals

\uuu init\uuuuuuuuuy.py

default_app_config = 'my_awesome_app.apps.MyAwesomeAppConfig'

Django 1.8 docs

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().

编辑:

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

相关问题 更多 >