【发布时间】:2016-11-27 16:13:04
【问题描述】:
我正在使用 Django 和 JS 制作一个小软件,用于处理图像上传。到目前为止,一切都很好。我从 dropzone.js 通过 AJAX 获得了漂亮的小图像。它们保存在文件系统中,并在我的照片模型中有一个 ImageField 来跟踪存储的内容和位置。
我什至刺破了 dropzone.js 以很好地要求我的开发服务器删除数据库条目和文件本身。我发现后半部分有点欠缺。所以我开始编写一个函数,它从我的照片模型中捕获一个 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 一起使用。
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
【问题讨论】: