2012-02-09 78 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

相關問題