2012-02-09 10 views
6

मेरे मामले में मैं उपयोगकर्ता को अवतार चित्र अपलोड करने और उपयोगकर्ता नाम को फ़ाइल नाम के रूप में उपयोग करने की अनुमति देता हूं। तो 1.jpg, 2.jpg, आदिDjango को फ़ाइल नाम बदलने से कैसे रोकें जब उस नाम वाली फ़ाइल पहले से मौजूद है?

हालांकि मुझे पता चला कि मैंने कुछ खाते के लिए एक नया अवतार अपलोड किया है, जिसे पहले से अपलोड किया गया है, आइए उपयोगकर्ता # 10 कहें, नई फाइल को " 10_1.jpg "। यह ठीक है, हालांकि मुझे इसकी आवश्यकता नहीं है और मुझे उम्मीद है कि नई फाइल पुराने को ओवरराइट कर सकती है - यह वैसे भी कुछ डिस्क स्पेस बचाती है।

मैं googled और खोजा लेकिन एक सुराग नहीं मिला। मैं उम्मीद कर रहा था कि इमेजफिल्ड या फाइलफिल्ड के लिए एक विकल्प होगा लेकिन यह वहां नहीं है।

मदद के लिए धन्यवाद!

+0

यहाँ एक नज़र: http://stackoverflow.com/questions/8332443/set-djangos-filefield-to-an-existing-file – Jingo

उत्तर

10

आपको अपना स्वयं का संग्रहण परिभाषित करना चाहिए, इसे फ़ाइल सिस्टम सिस्टम से प्राप्त करना चाहिए, और इसमें get_available_name फ़ंक्शन ओवरराइड करना चाहिए। अपने इमेजफील्ड के लिए इस स्टोरेज का उपयोग करें। कुछ इस तरह:

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

+0

तो आपको कोड की 50 लाइनों की प्रतिलिपि बनाना है, जो वास्तव में अच्छा नहीं है। यही कारण है कि get_available_name –

+0

ओवरराइड करना बेहतर है http://stackoverflow.com/questions/15885201/django-uploads-discard-uploaded-duplicates-use-existing-file-md5-based-check?answertab=votes# टैब टॉप – jdcaballerov

संबंधित मुद्दे