0

我正在使用 django 和 jquery 进行图像上传。首先我们使用上传器上传一张图片,图片存储在图片tmpbg字段中。然后,如果我们单击保存按钮,tmpbg则会将其移动到背景图像字段。这里我需要的是我想删除背景图像字段路径中的孤立图像文件。

这是代码

模型.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 之间的代码是正确的!

4

3 回答 3

1

我会覆盖模型的删除方法并在那里添加文件删除。我会做类似的事情:

class BackgroundModel(models.Model):
    ...

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

我没有检查代码,但是这样的东西应该可以工作。告诉我是否不是。:)

于 2012-04-29T16:42:03.990 回答
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("")
于 2012-04-29T17:18:08.450 回答
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()

另外,分配ImageFileFieldImageFileField复制文件路径,因此如果你这样做

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

g.background并将g.tmpbg指向同一个文件。一旦文件被删除g.backgroundg.tmpbg也将无法访问。如果你不想要这种行为,告诉 Django 保存到一个新文件:

from django.core.files.base import File
g.background = File(g.tmpbg)
g.save()
于 2012-04-29T19:53:58.797 回答