我正在使用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代码之间是正确的!。
答案 0 :(得分:1)
我会覆盖模型的删除方法并在那里添加文件删除。 我会做类似的事情:
class BackgroundModel(models.Model):
...
def delete(self, using=None):
os.unlink(self.tmpbg.path)
super(BackgroundModel,self).delete()
我没有检查代码,但这样的事情应该有用。告诉我,如果不是。 :)
答案 1 :(得分:1)
尝试使用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("")
答案 2 :(得分:0)
试试这个:
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()