2012-02-09 33 views
6

在我的情况下,我允许用户上传头像图片,并简单地使用user_id作为文件名。所以会有1.jpg,2.jpg等如何防止Django在具有该名称的文件已存在时更改文件名?

但是我发现如果我上传一个已经有一个上传的帐户的新头像,假设用户#10,新文件将被命名为“ 10_1.jpg”。这是OKay,但我不需要它,我希望新文件可以覆盖旧文件 - 它也可以节省一些磁盘空间。

我使用Google搜索,但无法找到线索。我希望有一个ImageField或FileField的选项,但它不在那里。

感谢您的帮助!

+0

看看这里: http://stackoverflow.com/questions/8332443/set-djangos-filefield-to-an-existing-file – Jingo 2012-02-09 17:39:48

回答

10

您应该定义自己的存储,从FileSystemStorage继承它,并覆盖它中的get_available_name函数。将这个存储用于你的imagefield。 事情是这样的:

class OverwriteStorage(FileSystemStorage): 

    def get_available_name(self, name): 
     if self.exists(name): 
      os.remove(os.path.join(SOME_PATH, name)) 
     return name 

fs = OverwriteStorage(location=SOME_PATH) 

class YourModel(models.Model): 
    image_file = models.ImageField(storage=fs) 
+0

嗨,哥们。我刚刚发现这是开始的正确的地方,但是'get_available_name'不是重写的方法。我重写'_save',现在一切正常。 – x1a0 2012-03-23 12:49:21

+0

所以你必须复制50行代码,这并不是很好。这就是为什么最好重写get_available_name – 2012-03-29 20:47:39

+0

参考这个问题http://stackoverflow.com/questions/15885201/django-uploads-discard-uploaded-duplicates-use-existing-file-md5-based-check?answertab=votes#标签顶 – jdcaballerov 2014-02-04 18:01:44

相关问题