获取ImageField文件路径post_delete

时间:2016-11-27 16:13:05

标签: python django

我正在使用Django和JS制作一个可以处理图像上传的软件。到现在为止还挺好。我从dropzone.js通过AJAX获得了很好的小图像。它们保存在文件系统中,并在我的Photo模型中有一个ImageField,用于跟踪存储的内容和位置。

我甚至刺伤了dropzone.js,很好地请求我的开发服务器删除数据库条目和文件本身。我发现后一部分缺乏一点。所以我开始编写一个函数,从我的Photo模型中捕获post_delete信号,并负责处理文件系统中的删除。问题是,我似乎无法找到一种方法来获取存储在数据库中的文件路径。

如果我理解正确,以下内容应该有效:

from django.db import models
from django.db.models.signals import post_delete
from django.dispatch import receiver

class Photo(models.Model):
imageFile = models.ImageField(upload_to=generateImageFileNameAndPath)

@receiver(post_delete, sender=Photo)
def cleanupImageFiles(sender, **kwargs):
    print("Cleanup called")
    p = kwargs['instance']
    path = p.imageFile.name
    print(path)

但是当我尝试将path输出到控制台时,没有任何内容。

很抱歉关于upperCasing而不是使用under_scores似乎是Python惯例。我个人觉得下划线会议有点烦人,我正在讨论是否遵循惯例或者只是按照自己的方式进行摔跤比赛。现在,我已经完成了后者。

修改:我似乎无法按照建议here使其与p.imageFile.url一起使用。

编辑:我也尝试过pre_delete信号,认为可能post_delete数据已经被破坏了,这将是愚蠢的,但谁知道:),

edit3:调用imageFile.path,也不会剪切它。它只是产生

[27/Nov/2016 22:29:08] "POST /correcturl/upload/ HTTP/1.1" 200 
Cleanup called
[27/Nov/2016 22:29:15] "DELETE /correcturl/upload/  HTTP/1.1" 500 37 
控制台窗口上的

。 HTTP错误500仅来自视图无法处理删除调用,因为此代码无法正常工作。这就是我在此时用作前端的状态消息。 值得注意的是,如果我这样做

print(p)

控制台上的输出是

Photo object

2 个答案:

答案 0 :(得分:0)

如果您需要图片的路径,请尝试:

path = p.imageField.path

P.S。:是的,你应该遵循惯例。否则,如果您与某人共享代码,或者为开源项目做贡献,或者聘请公司的程序员等,那么其他人很难阅读您的代码。

答案 1 :(得分:0)

我知道我必须做一些愚蠢的事情,最后有时间回到调试阶段。

在我看来,我已经完成了

deletable = Photo(id=id)

而不是

deletable = Photo.objects.get(id=id)

因此以一个新的照片对象结束,只填充了id字段。因为从未调用过Photo.save(),所以这并没有在我的数据库中结束,也没有抛出任何错误。因此,这个虫子在我的雷达下悄悄地飞了起来。

因此,当最后调用

deletable.delete()

它只删除了我刚刚创建的不完整实例。虽然,它也删除了DB的正确输入。这就是让我失望的原因,让我大部分时间都在寻找其他问题,因为我手中有正确的数据库对象。

这种行为的来源仍然不清楚。 delete()实际上是在检查数据库中的id(在这种情况下会找到它)而不仅仅是处理有问题的实例吗?我想看看django.db.models.Model.delete()可以对此有所了解。