2016-11-27 104 views
0

我做一小片的使用Django和JS将处理图片上传软件。到现在为止还挺好。我从dropzone.js通过AJAX获得漂亮的小图片。它们保存在文件系统中,并在我的Photo模型中有一个ImageField,用于跟踪存储的内容和位置。获取的ImageField文件路径post_delete

我甚至捅dropzone.js很好地询问我的dev的服务器删除数据库条目和文件本身。我发现后者缺乏一点。于是我开始编写一个函数,捕获来自我的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的约定。我个人觉得下划线会议有点烦人,我正在脑海里摔跤比赛,不管是按照惯例还是走自己的路。现在,我已经完成了后者。

编辑:我似乎无法使其与p.imageFile.url一起使用,建议here

editedit:我也试图与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 

回答

0

我知道我必须做了一些愚蠢的最后有时间回到调试。

在我看来,我做的

deletable = Photo(id=id) 

代替

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

从而结束了与刚填充id字段新的照片对象。因为Photo.save()是从来没有打过电话,这并没有在我的数据库中出现,也没有发生任何错误。正因为如此,这个虫子在我的雷达下悄然飞去。

因此,当最后调用

deletable.delete() 

只删除我刚刚创建的uncomplete实例。尽管它也从DB中删除了正确的条目。这就是让我失望的原因,并且让我主要在别处寻找这个问题,因为我认为我手中有正确的数据库对象。

这种行为来自何处仍然不清楚。是否delete()实际上检查数据库的id(在这种情况下会找到它),而不是仅仅处理有问题的实例?我想看看django.db.models.Model.delete()可以揭示一些事情。

0

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

path = p.imageField.path 

PS :是的,你应该遵守公约。否则,将很难,如果你与别人分享,别人看你的代码,或有助于一个开源项目,或者在你的公司雇佣程序员等

+0

不起作用。见编辑号码3. – xtrom0rt

+0

@ xtrom0rt嗯......有趣。试穿后让我回复你。 – xyres

+0

是的,这很奇怪。如果我执行instance.pk,它会为该行提供正确的主键,所以我们应该在对象实例上有一个体面的句柄。然而它表现奇怪。 – xtrom0rt