Skip to content

Instantly share code, notes, and snippets.

@fabiomontefuscolo
Created January 9, 2012 19:20
Show Gist options
  • Star 20 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save fabiomontefuscolo/1584462 to your computer and use it in GitHub Desktop.
Save fabiomontefuscolo/1584462 to your computer and use it in GitHub Desktop.
Let the Django FileField overwrite files with the same name
# -*- coding: utf-8 -*-
from django.conf import settings
from django.core.files.storage import FileSystemStorage
from django.db import models
class OverwriteStorage(FileSystemStorage):
'''
Muda o comportamento padrão do Django e o faz sobrescrever arquivos de
mesmo nome que foram carregados pelo usuário ao invés de renomeá-los.
'''
def get_available_name(self, name):
if self.exists(name):
os.remove(os.path.join(settings.MEDIA_ROOT, name))
return name
class Media(models.Model):
name = models.CharField(u"Nome", max_length=128))
media = models.FileField(u"Arquivo", upload_to=settings.MEDIA_DIR, storage=OverwriteStorage())
@julianklotz
Copy link

julianklotz commented Jan 20, 2022

Thanks! Helped me fix my problem quickly.

Here’s a sidenote: The original get_available_name method e.g. does a check for suspicious file operations and max_length. To benefit from the original method, call super():

storage.py

from django.core.files.storage import FileSystemStorage


class FileSystemOverwriteStorage(FileSystemStorage):
    """
    Custom file system storage: Overwrite get_available_name to make Django replace files instead of
    creating new ones over and over again.
    """
    def get_available_name(self, name, max_length=None):
        self.delete(name)
        return super().get_available_name(name, max_length)

… and in settings.py:

# …
DEFAULT_FILE_STORAGE = '<my-app>.storage.FileSystemOverwriteStorage'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment