我有发布或删除前的信号我不知道该使用哪个,但我的问题是,为什么这个信号没有激活?它永远不会将文件保存在目录中。它什么也没做。
以下是代码:
@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")
知道它为什么不起作用?任何帮助将不胜感激。
答案 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'
实际上,信号处理程序通常以信号定义 与其相关的应用程序的子模块。信号接收器是 在应用程序配置的
ready()
方法中连接 类。 如果您正在使用receiver()
装饰器,只需导入 在ready()
内发信号子模块。
修改强>
对AppConfig
进行子类化并在signals
方法中导入单独的ready
模块并不需要让信号正常工作;当Django启动时,最好避免同一个信号处理程序连接多次。我所展示的并不是连接信号处理程序的唯一方法,但这是推荐的方式。