Python django-删除图像文件
我使用django和jquery上传图像。首先,我们使用uploader上传一个图像,该图像存储在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
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()