[英]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.background
和g.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.