我正在使用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
一起使用。
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
答案 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()可以对此有所了解。