2016-11-27 28 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