簡體   English   中英

django - 刪除圖像文件

[英]django - deleting image files

我正在使用django和jquery進行圖片上傳。 首先我們使用上傳器上傳圖像,圖像存儲在tmpbg圖像域中。 然后,如果我們單擊“保存”按鈕, tmpbg將移動到背景圖像域。 這里我需要的是我想刪除背景圖像域路徑中的孤立圖像文件。

這是代碼

Models.py:

class BackgroundModel(models.Model):
    user = models.OneToOneField(User)
    background = models.ImageField(upload_to='backgrounds', null=True, blank=True)
    tmpbg = models.ImageField(upload_to='backgrounds', null=True, blank=True)

class BackgroundModelForm(ModelForm):
    class Meta:
        model = BackgroundModel
        exclude = ('user', 'background')

Views.py(刪除路徑中圖像文件的代碼):

try:
    bg = BackgroundModel.objects.get(user=request.user)
except BackgroundModel.DoesNotExist:
    pass
else:
    if bg.background != '':
        image_path = os.path.join(settings.MEDIA_ROOT, str(bg.background))
        try:
            os.unlink(image_path)
            bg.BackgroundModel.delete()
        except:
            pass

    bg.background = bg.tmpbg
return HttpResponse("")

但是孤立的圖像文件不會被刪除。 我犯了什么錯誤?

更新:

這一行存在問題

bg.background=bg.tmpbg

當我檢查shell模式時。 它沒有顯示。

>>> g.background
<ImageFieldFile: None>

但是tmpbg中有一個圖像文件

>>> g.background
<ImageFieldFile: backgrounds/ijkl.jpg>

那么,我如何從一個圖像場復制到另一個場?

在image_path代碼之間是正確的!

我會覆蓋模型的刪除方法並在那里添加文件刪除。 我會做的事情如下:

class BackgroundModel(models.Model):
    ...

    def delete(self, using=None):
        os.unlink(self.tmpbg.path)
        super(BackgroundModel,self).delete()

我沒有檢查代碼,但這樣的事情應該有效。 告訴我,如果不是。 :)

嘗試使用os.normpath ,這應該可以解決問題:

 image_path = os.path.normpath(
     os.path.join(settings.MEDIA_ROOT, str(bg.background))
 )

更新:

try:
    bg = BackgroundModel.objects.get(user=request.user)
except BackgroundModel.DoesNotExist:
    pass
else:
    if bg.background != '':
        image_path = os.path.join(settings.MEDIA_ROOT, str(bg.background))
        try:
            os.unlink(image_path)
        except:
            pass

    bg.background = bg.tmpbg
    bg.save()
 return HttpResponse("")

嘗試這個:

try:
    bg = BackgroundModel.objects.get(user=request.user)
except BackgroundModel.DoesNotExist:
    pass
else:
    if bg.background:
        file_to_delete = bg.background.path
        bg.background = bg.tmpbg
        bg.save()
        try:
            os.unlink(file_to_delete)
        except:
            pass
return HttpResponse()

另外,將ImageFileField分配給ImageFileField只需復制文件路徑,如果這樣做

g.background = g.tmpbg
g.save()

g.backgroundg.tmpbg將指向同一個文件。 一旦通過g.background刪除文件, g.tmpbg也將無法訪問。 如果您不想要此行為,請告訴Django保存到新文件:

from django.core.files.base import File
g.background = File(g.tmpbg)
g.save()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM