2010-05-20 14 views
20

मैं स्टॉक फोटो साइट बनाने के लिए Django का उपयोग कर रहा हूं, मेरे पास मेरे मॉडल में एक छविफाइल है, समस्या यह है कि जब उपयोगकर्ता छवि फ़ील्ड को अद्यतन करता है, तो मूल छवि फ़ाइल हार्ड डिस्क से नहीं हटाई जाती है।ImageField अपडेट करते समय पुरानी छवि को कैसे हटाएं?

अद्यतन के बाद पुरानी छवियों को मैं कैसे हटा सकता हूं?

उत्तर

13

आपको पुरानी छवि को मैन्युअल रूप से हटाना होगा।

छवि का पूर्ण पथ your_image_field.name में संग्रहीत किया जाता है। तो अगर आप की तरह कुछ करना चाहते हैं:

os.remove(your_image_field.name) 

लेकिन, एक सुविधा के रूप, आप जुड़े FieldFile वस्तु है, जो अंतर्निहित फ़ाइल के लिए आसान पहुँच है, साथ ही कुछ सुविधा तरीकों प्रदान करने देता है का उपयोग कर सकते हैं। अपने मॉडल में इस कस्टम विधि बचाने देखें http://docs.djangoproject.com/en/dev/ref/models/fields/#filefield-and-fieldfile

+0

क्या यह django ImageField का डिफ़ॉल्ट व्यवहार नहीं है? इस पोस्ट के आधार पर: http://www.redrobotstudios.com/blog/2010/03/02/dont-delete-image-file-when-deleting-django-model-instance/? –

+0

ओपी एक छविफाइल के साथ एक मॉडल उदाहरण अद्यतन करने के बारे में पूछ रहा था (यानी उपयोगकर्ता एक नई छवि अपलोड करता है)। उस स्थिति में, पुरानी छवि हटाई नहीं गई है। –

+0

नोट: मुझे यकीन नहीं है कि यह तब से बदल गया है या यदि यह थोड़ा सा है, लेकिन 1.6 imgfield.name में एक सापेक्ष पथ है। imgfield.file.name का पूरा पथ है। – kungphu

10

उपयोग:

def save(self, *args, **kwargs): 
    try: 
     this = MyModelName.objects.get(id=self.id) 
     if this.MyImageFieldName != self.MyImageFieldName: 
      this.MyImageFieldName.delete() 
    except: pass 
    super(MyModelName, self).save(*args, **kwargs) 

यह मेरी साइट पर मेरे लिए काम करता है। यह समस्या मुझे भी परेशान कर रही थी और मैं पहले स्थान पर अच्छी बहीखाता के बजाय क्लीनअप स्क्रिप्ट नहीं बनाना चाहता था। अगर मुझे इसके साथ कोई समस्या है तो मुझे बताएं।

+8

आप शायद यह उपयोग करना चाहें: 'this.MyImageFieldName.delete (save = False)' क्योंकि मैंने 'MyModelName' मॉडल के 'सेव' को रिकर्सिव रूप से हटाया है, सावधान रहें ... और प्रिंट के साथ परीक्षण करें सहेजने की विधि में –

+1

यह मॉडल को हटाने के बाद फ़ाइल को हटाना भी बेहतर है। यदि मॉडल को हटाना किसी भी कारण से विफल रहता है तो आप फ़ाइल को खोना नहीं चाहते हैं। – Reza

12

उपयोग django-cleanup

pip install django-cleanup 

settings.py

INSTALLED_APPS = (
    ... 
    'django_cleanup', # should go after your apps 

) 
8

मॉडल उदाहरण अद्यतन करने से पहले, आप FileField वस्तु के नष्ट विधि का उपयोग कर सकते हैं। उदाहरण के लिए, यदि FileField या ImageFieldphoto के रूप में अपने मॉडल उदाहरण profile है, तो निम्नलिखित डिस्क

profile.photo.delete(False) 

से फ़ाइल को हटा देगा और अधिक स्पष्टीकरण के लिए नामित किया गया और किया जाता है, यहां Django डॉक

https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.fields.files.FieldFile.delete

है
2

यहां एक ऐसा ऐप है जो डिफ़ॉल्ट रूप से अनाथ फ़ाइलों को हटा देता है: django-smartfields। (बेशक मामले में है कि क्षेत्र की आवश्यकता नहीं है,)

  • फ़ील्ड मान एक नया एक के साथ बदल दिया है (या तो अपलोड या मैन्युअल रूप से सेट) था
  • क्षेत्र फार्म के माध्यम से साफ कर दिया जाता
  • : यह जब भी फ़ाइलों को हटा देगा
  • मॉडल उदाहरण स्वयं फ़ील्ड को हटा दिया गया है। सेटिंग्स SMARTFIELDS_KEEP_ORPHANS = True में विश्व स्तर पर ImageField(keep_orphans=True) क्षेत्र आधार प्रति पर, या:

यह एक बहस का उपयोग कर कि सफाई सुविधा को बंद करने के लिए संभव है।

from django.db import models 

from smartfields import fields 

class MyModel(models.Model): 
    image = fields.ImageField() 
    document = fields.FileField() 
संबंधित मुद्दे