1

我有一个这个模型...

class MyModel(models.Model):
    ...
    file = models.FileField(upload_to='files/',null=True, blank=True)
    ...

当我上传文件时,示例文件名为docfile.doc. 当我更改文件或重写文件并再次上传时docfile.doc,文件将变为docfile_1.doc旧文件docfile.doc仍然存在。

我正在上传和保存数据django-admin

docfile.doc我的问题是,如果我上传新docfile.doc的并且文件名仍然存在,我该如何删除旧的docfile.doc

任何人都可以帮助我吗?提前致谢

我试试这个:

def content_file_name(instance, filename):
    print instance
    print filename
    file = os.path.exists(filename)
    print file
    if file:
        os.remove(filename)
    return "file/"+str(filename)

 class MyModel(models.Model):
        ...
        file = models.FileField(upload_to=content_file_name,null=True, blank=True)
        ...

但是什么也没发生,当我再次上传docfile.doc时,它会变成docfile_1.doc旧的docfile.doc仍然存在。

4

4 回答 4

2

我不知道该怎么做,但我认为这些链接可以帮助你:

在这里您可以找到 FileField 接受的两个选项。我认为你最感兴趣的是FileField.storage。您可以在该参数中传递存储对象。

它说:

FileField.storage:可选。一个存储对象,用于处理文件的存储和检索。

然后,如果您阅读本文,您会发现您可以编写自己的存储对象。是有关如何执行此操作的一些说明。我认为您可以重写该_save方法以完成您想要做的事情(即:如果文件已经存在,请在保存新副本之前将其删除。)

不过要小心!我不知道您要存储的文件的来源。也许,您的应用程序会收到许多同名的文件,尽管它们都是不同的。在这种情况下,您可能希望使用可调用对象作为FileField.upload_to参数,以便为您的站点接收的每个文件确定一个唯一的文件名。

我希望这可以帮助你!

于 2012-05-28T04:27:34.393 回答
1

我明白了……我用这个

def content_file_name(instance, filename):
    print instance
    print filename
    file = os.path.exists("media/file/"+str(filename))
    print file
    if file:
        os.remove("media/file/"+str(filename))
    return "file/"+str(filename)
于 2012-05-28T04:04:27.997 回答
0

你也可以看看这里:ImageField 覆盖同名的图像文件

定义你自己的存储并覆盖它的 get available_name 方法。

于 2012-05-28T09:07:42.617 回答
0

下一个代码解决了您的问题。您覆盖图像实际保存到存储中的 pre_save 方法。请为您的项目重命名函数。将新创建的图像字段ImageFieldWithPermantName与您的upload_to函数 (content_file_name) 一起使用。

如果代码太复杂,您可以简化它。我使用代码执行更复杂的图像上传操作:我在自定义 _save_image 函数中即时创建缩略图。所以,你可以简化它。

from PIL import Image
import StringIO
from django.db.models import ImageField
from django.db.models.fields.files import FileField
from dargent.settings import MEDIA_ROOT
import os

class ImageFieldWithPermanentName( ImageField ):
    def pre_save( self, model_instance, add ):
        file = super( FileField, self ).pre_save(model_instance, add)
        if file and not file._committed:
            if callable( self.upload_to ):
                path = self.upload_to( model_instance, "" )
            else:
                path = self.upload_to
            file.name = path # here we set the same name to a file
            path = os.path.join( MEDIA_ROOT, path )
            chunks = _get_chunks( file.chunks() )
            _save_image( chunks, path )

        return file     

def _get_chunks( chunks ):
    chunks_ = ""
    for chunk in chunks:
        chunks_ += chunk
    return chunks_

def _get_image( chunks ):
    chunks_ = ""
    for chunk in chunks:
        chunks_ += chunk

    virt_file = StringIO.StringIO( chunks_ )
    image = Image.open( virt_file )
    return image

def _save_image( chunks, out_file_path ):
    image = _get_image( chunks )
    image.save( out_file_path, "JPEG", quality = 100 )
于 2012-05-29T06:21:23.463 回答