【问题标题】:Getting ImageField file path post_delete获取 ImageField 文件路径 post_delete
【发布时间】: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

【问题讨论】:

    标签: python django


    【解决方案1】:

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

    path = p.imageField.path
    

    P.S.:是的,您应该遵守约定。否则,如果您与他人共享代码、为开源项目做出贡献、或在您的公司雇用程序员等,其他人将很难阅读您的代码。

    【讨论】:

    • @xtrom0rt 嗯...有趣。试用后让我回复您。
    • 是的,这很奇怪。如果我执行 instance.pk,它会为我提供正确的行主键,因此我们应该对对象实例有一个不错的句柄。然而它的行为很奇怪。
    【解决方案2】:

    我知道我必须做一些愚蠢的事情,终于有时间重新调试。

    在我看来我已经完成了

    deletable = Photo(id=id)
    

    而不是

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

    因此最终得到一个新的照片对象,其中只填充了 id 字段。因为从未调用过 Photo.save(),所以它最终没有出现在我的数据库中,也没有引发错误。正因为如此,这只虫子在我的雷达下悄悄地飞了起来。

    因此,当最终调用时

    deletable.delete()
    

    它只删除了我刚刚创建的不完整实例。虽然,它也从数据库中删除了正确的条目。这就是让我感到厌烦的原因,让我大部分时间都在寻找其他问题,以为我手中有正确的数据库对象。

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

    【讨论】:

      猜你喜欢
      • 2013-09-15
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 2012-06-12
      • 2011-11-16
      • 2021-09-10
      相关资源
      最近更新 更多