django - 删除图像文件

时间:2012-04-29 16:17:38

标签: python django django-models

我正在使用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代码之间是正确的!。

3 个答案:

答案 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.backgroundg.tmpbg将指向同一个文件。通过g.background删除文件后,g.tmpbg也将无法访问。如果您不想要这种行为,请告诉Django保存到新文件:

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