2012-02-09 43 views
6

Trong trường hợp của tôi, tôi cho phép người dùng tải lên hình đại diện và chỉ sử dụng user_id làm tên tệp. Vì vậy, sẽ có 1.jpg, 2.jpg, v.v.Làm thế nào để ngăn chặn Django thay đổi tên tệp khi một tệp có tên đó đã tồn tại?

Tuy nhiên tôi thấy nếu tôi tải lên hình đại diện mới cho một số tài khoản đã tải lên, giả sử người dùng # 10, tệp mới sẽ được đặt tên là " 10_1.jpg ". Đây là OKay, tuy nhiên tôi không cần nó và tôi hy vọng tập tin mới có thể ghi đè lên một cũ - nó cũng tiết kiệm một số không gian đĩa anyway.

Tôi đã tìm kiếm và tìm kiếm nhưng không thể tìm thấy manh mối. Tôi đã hy vọng sẽ có một lựa chọn cho ImageField hoặc FileField nhưng nó không có ở đó.

Cảm ơn bạn đã trợ giúp!

+0

Có một cái nhìn ở đây: http://stackoverflow.com/questions/8332443/set-djangos-filefield-to-an-existing-file – Jingo

Trả lời

10

Bạn nên xác định dung lượng lưu trữ của chính mình, kế thừa từ FileSystemStorage và ghi đè hàm get_available_name trong đó. Sử dụng bộ nhớ này cho lĩnh vực hình ảnh của bạn. Something như thế này:

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

Hey man. Tôi chỉ tìm thấy đây là nơi thích hợp để bắt đầu với tuy nhiên 'get_available_name' không phải là phương pháp để ghi đè lên. Tôi ghi đè '_save' và mọi thứ hoạt động ngay bây giờ. – x1a0

+0

Vì vậy, bạn phải sao chép 50 dòng mã, điều này không thực sự tốt. Đó là lý do tại sao tốt hơn là ghi đè get_available_name –

+0

Tham khảo câu hỏi này http://stackoverflow.com/questions/15885201/django-uploads-discard-uploaded-duplicates-use-existing-file-md5-based-check?answertab=votes# tab-top – jdcaballerov

Các vấn đề liên quan