2022-04-03
Overwrite image in Django
Part of workflow of my side project "Side Project List" (shut down) is:
- Add data manually on local Django app: site url, twitter handle, full name, etc
- Selenium saves screenshot to local file
e.g. /media/screenshot/name1
- Upload to Cloudinary
- ...
Issue:
Noted same screenshots were saved locally with different names overtime e.g. name1, name1_abc, name1_xyz, etc
Solution:
Make Django overwrite — actually remove and save — instead of saving with new random name
Before
# project/models.py class Project(models.Model): screenshot = models.ImageField(upload_to="screenshot/", null=True, blank=True)
After
# project/models.py import os from django.core.files.storage import FileSystemStorage class OverwriteStorage(FileSystemStorage): def get_available_name(self, name, max_length=None): if self.exists(name): os.remove(os.path.join(settings.MEDIA_ROOT, name)) return name class Project(models.Model): screenshot = models.ImageField(upload_to="screenshot/", null=True, blank=True, storage=OverwriteStorage)