Python django-删除图像文件

Python django-删除图像文件,python,django,django-models,Python,Django,Django Models,我使用django和jquery上传图像。首先,我们使用uploader上传一个图像,该图像存储在tmpbgimagefield中。然后,如果我们单击save按钮,tmpbg将被移动到background imagefield。这里我需要的是删除背景imagefield路径中的孤立图像文件 这是密码 Models.py: class BackgroundModel(models.Model): user = models.OneToOneField(User) backgroun

我使用django和jquery上传图像。首先,我们使用uploader上传一个图像,该图像存储在
tmpbg
imagefield中。然后,如果我们单击save按钮,
tmpbg
将被移动到background imagefield。这里我需要的是删除背景imagefield路径中的孤立图像文件

这是密码

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(用于删除路径中的图像文件的代码):

但孤立的图像文件不会被删除。我犯了什么错误

更新:

这方面有个问题

bg.background=bg.tmpbg
当我选择shell模式时。它显示没有

>>> g.background
<ImageFieldFile: None>
>>g.background
但是tmpbg中有一个图像文件

>>> g.background
<ImageFieldFile: backgrounds/ijkl.jpg>
>>g.background
那么,如何从一个图像字段复制到另一个字段


图像之间的路径代码正确

我会覆盖模型的delete方法,并在那里添加file delete。 我会这样做:

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()

不,它仍然不会删除图像文件。请检查我更新的代码。我有tmpbg和背景在同一个模型中。因此,在将tmpbg传输到后台之前,不应将其删除。我说的对吗?为了将tmpbg复制到后台,我仍然会用delete方法编写代码。在任何情况下,请在计算图像路径后尝试打印它,并检查它是否正确。我想你应该这样做:image\u path=os.path.join(settings.MEDIA\u ROOT,str(bg.tmpbg.filename))现在请检查我的问题。谢谢没有str呢?像image\u path=os.path.normpath(os.path.join(settings.MEDIA\u ROOT,bg.background))这样的东西现在请检查我的问题。谢谢bg.background.path就是你想要的,你不需要normpath/join等
from django.core.files.base import File
g.background = File(g.tmpbg)
g.save()