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)